永发信息网

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

答案:4  悬赏:40  手机版
解决时间 2021-02-25 07:58
  • 提问者网友:wodetian
  • 2021-02-24 20:46
C 或 C++ 语言
求个算法 用C 或 C++ 语言 编的
最佳答案
  • 五星知识达人网友:荒野風
  • 2021-02-24 21:26
因为是九位数,没有重复数字,前N位能被N整除
所以偶数位上一定是偶数,奇数位上一定是奇数
5 一定是在第五位上

简单循环遍历

#include <stdio.h>

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
全部回答
  • 1楼网友:十年萤火照君眠
  • 2021-02-24 22:31
他们的都过于复杂,,,我有简单办法,,你可以找我聊,,,
  • 2楼网友:猎心人
  • 2021-02-24 21:58
随便,只要第5位是5
  • 3楼网友:千杯敬自由
  • 2021-02-24 21:42
位数为9,所以枚举复杂度为O(9!) 完全可以接受 加上剪枝,0MS出解 参考代码如下 使用了dfs来实现枚举 #include<iostream> 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<<val<<endl; 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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯