C语言:求最小的x中遇到的难题

img

img

img

为什么我的结果都是no,代码也好像没有判断过s是否等于i,直接循环81次。
看了很久怎么也找不到原因,求解答!


#include 
int s_(int a,int b,int c,int d,int *x)
{
    int i,n,s=0;
    for(i=0; i<=81; i++)
    {
        *x=(i+a)*(i+b)*(i+c)*(i+d);
        n=x;
        while(n)
        {
            s+=n%10;
            n/=10;
        }
        if(s==i)
            return 1;
    }
    return 0;
}
int main()
{
    long long int x,n,i,s;
    int a,b,c,d,k;
    while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
    {
        if(s_(a,b,c,d,&x))
            printf("%lld\n",x);
        else
            printf("no\n");
    }
    return 0;
}

根据你的代码,我发现可能是以下两个问题导致结果一直为"no":

在函数s_中,当计算出的 n 赋值给 *x 后,你没有将s清零,导致s的值一直叠加,可能导致后面的判断出错。你可以在每次计算新的 n 时将 s 初始化为0。

在函数s_中,n=x的操作赋值的是指针x的值而不是变量x的值,导致后面的 s+=n%10 和 n/=10 操作出现问题。你需要将 n 改为 *x,以便对 x 指针所指向的变量进行操作。

针对以上两个问题,你可以尝试修改函数s_的代码如下:

int s_(int a,int b,int c,int d,int *x)
{
    int i, n, s;
    for(i = 0; i <= 81; i++)
    {
        *x = (i+a)*(i+b)*(i+c)*(i+d);
        n = *x;
        s = 0; // 在每次计算新的n时将s初始化为0
        while(n)
        {
            s += n % 10;
            n /= 10;
        }
        if(s == i)
            return 1;
    }
    return 0;
}

确实对了,谢谢大佬!一开始我没用函数,把s=0放在for循环外面了,重新用函数写的时候又忘记了😅

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^