傻一点的办法就是穷举了,把8位数都遍历一遍。分解出8位数字,判断是否符合条件。题目的时间限制是多长?
#include<stdio.h>
#include <math.h>
void int2arr(int n,int *a)
{
int i = 7;
while(n>0)
{
a[i--] = n%10;
n/=10;
}
}
int isprime(int n)
{
if(n<2)
return 0;
int k = sqrt(n*1.0);
for(int i=2;i<=k;i++)
if(n%2==0)
return 0;
return 1;
}
int main()
{
/*有7个人在一起玩猜电话号码的游戏。
这是一个8位的电话号码。
甲说,这个数字的千万位数字比百万位数字大。
乙说,这个数字的百位数字与十位数字相同。
丙说,这个数字的百万位、十万位、万位数字相乘的结果与百位、十位、个位数字相乘的结果相同,并且这个乘积不为0。
丁说,把这个数字的十万位、万位、千位、百位数字看作一个四位数,这个四位数是一个非负整数的平方。
戊说,把这个数字的千万位、千位、个位数字相加,和是一个质数。
己说,把这个数字的所有数位相加,和是10的整数倍。
你是庚,请列出所有满足条件的8位数字。*/
for(int i=10000000;i<=99999999;i++)
{
int a[8];
int2arr(i,a);
if(a[0] <= a[1])
continue;
if(a[5] != a[6])
continue;
if(a[1]*a[2]*a[3] == 0 || a[1]*a[2]*a[3] != a[5]*a[6]*a[7])
continue;
int k = a[2]*1000 + a[3]*100 + a[4]*10 + a[5];
int p = sqrt(k*1.0);
if(fabs(p*p-k*1.0) > 0.00001)
continue;
if(!isprime(a[0]+a[4] + a[7]))
continue;
int sum = 0;
for(int j=0;j<8;j++)
sum += a[j];
if(sum %10 != 0)
continue;
printf("%d\n",i);
}
return 0;
}