C 或 C++ 语言
求个算法 用C 或 C++ 语言 编的
!~~[有一个九位数,它由1到9这9个数组成,每个数字刚好出现一次.这个九位数前N位能被N整除]
答案:4 悬赏:40 手机版
解决时间 2021-02-25 07:58
- 提问者网友:wodetian
- 2021-02-24 20:46
最佳答案
- 五星知识达人网友:荒野風
- 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
所以偶数位上一定是偶数,奇数位上一定是奇数
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;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯