牛客网上变种水仙花 我的代码哪里有问题呀,我感觉真没问题

img


这是题目,感谢
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1461 + 1461 + 146*1

求出 5位数中的所有 Lily Number。

不要用pow()函数,修改如下,供参考:

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 10000; i <= 99999; i++)
    {
        int j = 0;
        int sum = 0;
        for (j = 10; j <= 10000; j *= 10)
        {
            sum += (i / j) * (i % j);

        }
        if (sum == i)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

pow这种浮点数计算的函数,存在精度误差
还是自己写一个,或者直接连乘

这是C:
以下是使用C语言编写的程序,用于求解5位数中的所有Lily Number:

#include <stdio.h>

int isLilyNumber(int num) 
{
    char numStr[6];
    sprintf(numStr, "%d", num);
    int n = strlen(numStr);

    for (int i = 1; i < n; i++) 
    {
        int leftNum = atoi(strndup(numStr, i));
        int rightNum = atoi(numStr + i);
        if (leftNum * rightNum == num)
        {
            return 1;
        }
    }
    return 0;
}

int main() 
{
    printf("5位数中的所有Lily Number:\n");
    for (int num = 10000; num < 100000; num++)
   {
        if (isLilyNumber(num))
        {
            printf("%d\n", num);
         }
    }

    return 0;
}

请注意,上述代码使用了标准库函数sprintfstrndup,需要包含头文件<stdio.h><string.h>。函数isLilyNumber用于判断一个数字是否为Lily Number,main函数则从10000遍历到99999,逐个判断并输出满足条件的Lily Number。

希望这段C代码能帮助您找到5位数中的所有Lily Number!如有任何问题,请随时提问。

【以下回答由 GPT 生成】

问题解答:

这里是一个优化的解决方案:

#include <stdio.h>

int main() {
    int count = 0;  // 记录Lily Number的个数
    int sum = 0;  // 记录Lily Number的和

    for (int num = 10000; num <= 99999; num++) {
        int left = num / 100;  // 拆分左边的数
        int right = num % 100;  // 拆分右边的数

        int leftSum = 0;  // 记录拆分左边的数的乘积和
        int rightSum = 0;  // 记录拆分右边的数的乘积和

        // 计算左边的数的乘积和
        for (int i = 1; i <= left; i *= 10) {
            int digit = (left / i) % 10;
            leftSum += digit * right;
            right *= 10;
        }

        // 计算右边的数的乘积和
        for (int i = 1; i <= right; i *= 10) {
            int digit = (right / i) % 10;
            rightSum += digit * left;
            left *= 10;
        }

        // 判断是否满足Lily Number的条件
        if (leftSum + rightSum == num) {
            printf("%d ", num);
            sum += num;
            count++;
        }
    }

    printf("\n");
    printf("一共找到%d个Lily Number\n", count);
    printf("Lily Number的和为%d\n", sum);

    return 0;
}

这个代码使用了两个嵌套的循环,对于五位数中的每个数字进行拆分和计算。首先将数字拆成左边的数和右边的数,然后分别计算左边的数的乘积和和右边的数的乘积和。最后判断两个乘积和的和是否等于原始数字,如果是,则表示这个数字是一个Lily Number。

这个解决方案的时间复杂度为O(n),其中n为5位数的个数(90000),因为对于每个数字,需要进行相应的拆分和计算。这个解决方案可以用于找出所有Lily Number并计算它们的和。

希望这个代码可以解决你的问题!如果你有任何其他问题,请随时问我!


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