!~~[有一个九位数,它由1到9这9个数组成,每个数字刚好出现一次.这个九位数前N位能被N整除]

C 或 C++ 语言求个算法 用C 或 C++ 语言 编的
2025-01-31 02:09:50
推荐回答(3个)
回答1:

因为是九位数,没有重复数字,前N位能被N整除
所以偶数位上一定是偶数,奇数位上一定是奇数
5 一定是在第五位上

简单循环遍历

#include

int main(void)
{
long i[9];
long j, n;

i[4] = 5;
for (i[0] = 1; i[0] < 10; i[0] += 2)
{
for (i[1] = 2; i[1] < 9; i[1] += 2)
{
for (i[2] = 1; i[2] < 10; i[2] += 2)
{
if (i[2] == i[0])
continue;
for (i[3] = 2; i[3] < 9; i[3] += 2)
{
if (i[3] == i[1])
continue;
for (i[5] = 2; i[5] < 9; i[5] += 2)
{
if (i[5] == i[3] || i[5] == i[1])
continue;
for (i[6] = 1; i[6] < 10; i[6] += 2)
{
if (i[6] == i[4] || i[6] == i[2] || i[6] == i[0])
continue;
for (i[7] = 2; i[7] < 9; i[7] += 2)
{
if (i[7] == i[5] || i[7] == i[3] || i[7] == i[1])
continue;
for (i[8] = 1; i[8] < 10; i[8] += 2)
{
if (i[8] == i[6] || i[8] == i[4] || i[8] == i[2] || i[8] == i[0])
continue;

n = 0;
for (j = 0; j < 9; j++)
{
n = n * 10 + i[j];
if (n % (j + 1) != 0)
break;
}
if (j == 9)
printf("%ld\n", n);
}
}
}
}
}
}
}
}
}

就一个数符合

381654729

回答2:

位数为9,所以枚举复杂度为O(9!)
完全可以接受
加上剪枝,0MS出解
参考代码如下

使用了dfs来实现枚举
#include
using namespace std;
typedef long long llong;
bool hash[10];//标记是否使用过...
void dfs(int dep,llong val)
{
int i;
llong tmp;
if(dep==9)//9位了
{
cout< return;
}
for(i=1;i<=9;++i)
{
if(!hash[i])
{
hash[i]=true;
tmp=val*10+i;
if(tmp%(dep+1)==0)
dfs(dep+1,tmp);
hash[i]=false;
}
}
}
int main()
{
dfs(0,0);
return 0;
}

回答3:

他们的都过于复杂,,,我有简单办法,,你可以找我聊,,,