1~9的9個數組成9位數並前n爲能被n整除

題目:來自程序員面試寶典

請將123456789九個數字以特定的順序排列,組成一個9位數ABCDEFGHI(每個數字只能使用一次),使得:
1.第一位數字組成的整數可以被1整除
2.第一、二位數字組成的整數可以被2整除
3.第一、二、三位數字組成的整數可以被3整除
4.第一、二、三、四位數字組成的整數可以被4整除
......

分析:

E=5(被5整除),則ABCD5FGHI

偶數位一定是偶數則BDFH={2,4,6,8},奇數位一定是奇數則ACGI={1,3,7,9};

ABCD被4整除,則(10C+D)被4整除,排除D={4,8}的情況後,D={2,6};同樣,ABCD5FGH被8整除,則(10G+H)能被4整除,H={2,6};故DH={2,6},BF={4,8};

ABCD5F被6整除,ABC被3整除,則(100D+50+F)能被3整除,結合D={2,6},F={4,8},可得DEF={258,654};

當DEF=258時,H=6,B=4,則A4C258G6I.

  由被8整除得8G6被8整除,結合G={1,3,7,9}得,G={1,9}

  當G=1時,AC={3,7,9},無法使A4C被3整除。

  當G=9時,AC={1,3,7};147、741、143、341能使A4C被3整除,但前7位都不能被7整除。

  DEF=258被否決,故:

DEF必然等於654,H=2,B=8,則A8C654G2I.

由被8整除得4G2被8整除,結合G={1,3,7,9}得,G={3,7}

  當G=3時,AC={1,7,9};189、981、789、987能使A8C被3整除,但前7位都不能被7整除。

  當G=7時,AC={1,3,9};183、381、189、981能使A8C被3整除,唯有381能被7整除,故得唯一解381654729

程序1:

#include<stdio.h>
#include<vector>
using namespace std;

bool use[10];
vector <long> v;
void dfs(int k, long a)
{
	if(k && a%k!= 0 )
		return;
	if(k == 9)
	{
		v.push_back(a);
		return;
	}
	for(int i=1;i <= 9;i++)
	{
		if( !use[i])
		{
			use[i]=1;
			dfs(k+1,a*10+i);
			use[i]=0;
		}
	}
}
int main()
{
	dfs(0,0);
	for(int i=0;i<v.size();i++)
		printf("%ld ",v[i]);
	printf("\n");
	return 0;
}


程序2:--轉自網絡

#include <iostream>
using namespace std;
void main()
{
  int a[9];
  int j, num;
  a[4] = 5;
  cout<<"所求的九位數爲:"<<endl;
  for (a[0] = 1; a[0] < 10; a[0] += 2)
  {
    for (a[1] = 2; a[1] < 9; a[1] += 2)
    {
      for (a[2] = 1; a[2] < 10; a[2] += 2)
      {
        if (a[2] == a[0])
          continue;
        for (a[3] = 2; a[3] < 9; a[3] += 2)
        {
          if (a[3] == a[1])
            continue;
          for (a[5] = 2; a[5] < 9; a[5] += 2)
          {
            if (a[5] == a[3] || a[5] == a[1])
              continue;
            for (a[6] = 1; a[6] < 10; a[6] += 2)
            {
              if (a[6] == a[4] || a[6] == a[2] || a[6] == a[0])
                continue;
              for (a[7] = 2; a[7] < 9; a[7] += 2)
              {
                if (a[7] == a[5] || a[7] == a[3] || a[7] == a[1])
                  continue;
                for (a[8] = 1; a[8] < 10; a[8] += 2)
                {
                  if (a[8] == a[6] || a[8] == a[4] || a[8] == a[2] || a[8] == a[0])
                    continue;
                  num = 0;
                  for (j = 0; j < 9; j++)
                  {
                    num = num * 10 + a[j];
                    if (num % (j + 1) != 0)
                      break;
                  }
                  if (j == 9)
                    cout<<num<<endl;
                }
              }
            }
          }
        }
      }
    }
  }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章