C语言用穷举循环判断实现猜字游戏

问题遇到的现象和发生背景

有7个人在一起玩猜电话号码的游戏。
这是一个8位的电话号码。
甲说,这个数字的千万位数字比百万位数字大。
乙说,这个数字的百位数字与十位数字相同。
丙说,这个数字的百万位、十万位、万位数字相乘的结果与百位、十位、个位数字相乘的结果相同,并且这个乘积不为0。
丁说,把这个数字的十万位、万位、千位、百位数字看作一个四位数,这个四位数是一个非负整数的平方。
戊说,把这个数字的千万位、千位、个位数字相加,和是一个质数。
己说,把这个数字的所有数位相加,和是10的整数倍。
你是庚,请列出所有满足条件的8位数字。

用代码块功能插入代码,请勿粘贴截图
我的解答思路和尝试过的方法

用循环和判断

我想要达到的结果

庚:53846446
甲:5>3
乙:4=4
丙:384=446
丁:8464=92*92
戊:5+6+6=17
己:5+3+8+4+6+4+4+6=40

傻一点的办法就是穷举了,把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;

}

如下循环代码,验证一下看看, 陪你疯一下

结果输出:
31240118
32291661
32921661
41152115
53846446
74384446
76291663
76921663
84144441