凉城听暖305 2023-10-21 16:15 采纳率: 0%
浏览 17

关于#c语言#的问题:输出格式:按递增顺序输出所有N位水仙花数(相关搜索:编写程序|输入在一行中)

您好,我最近遇到了一个问题,对于这样的一个题目:
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 本题要求编写程序,计算所有N位水仙花数。

输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:
3
输出样例:
153
370
371
407
代码长度限制
16 KB
时间限制
2500 ms
内存限制
64 MB
我写了如下代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int n,i,time = 0;
    int num;
    int s[10000]={0};
    scanf("%d",&n);
    num = pow(10,n-1);
    if(n == 3)
    {
        for(i=0; num<pow(10,n); i++, num++)
        {
            int a,b,c;
            a = num % 10;
            b = num / 10 % 10;
            c = num / 100;
            if(num == pow(a,3) + pow(b,3) + pow(c,3))
            {
                s[time]=num;
                time++;
            }
        }
    }
    else if(n == 4)
    {
        for(i=0;num<pow(10,n);i++,num++)
        {
            int a,b,c,d;
            a = num % 10;
            b = num / 10 % 10;
            c = num / 100 % 10;
            d = num / 1000;
            if(num == pow(a,4) + pow(b,4) + pow(c,4) + pow(d,4))
            {
                s[time]=num;
                time++;
            }
        }
    }
    else if(n == 5)
    {
        for(i=0;num<pow(10,n);i++,num++)
        {
            int a,b,c,d,e;
            a = num % 10;
            b = num / 10 % 10;
            c = num / 100 % 10;
            d = num / 1000 % 10;
            e = num / 10000;
            if(num == pow(a,5) + pow(b,5) + pow(c,5) + pow(d,5) + pow(e,5))
            {
                s[time]=num;
                time++;
            }
        }
    }
    else if(n == 6)
    {
        for(i=0;num<pow(10,n);i++,num++)
        {
            int a,b,c,d,e,f;
            a = num % 10;
            b = num / 10 % 10;
            c = num / 100 % 10;
            d = num / 1000 % 10;
            e = num / 10000 % 10;
            f = num / 100000;
            if(num == pow(a,6) + pow(b,6) + pow(c,6) + pow(d,6) + pow(e,6) + pow(f,6))
            {
                s[time]=num;
                time++;
            }
        }
    }
    else if(n == 7)
    {
        for(i=0;num<pow(10,n);i++,num++)
        {
            int a,b,c,d,e,f,g;
            a = num % 10;
            b = num / 10 % 10;
            c = num / 100 % 10;
            d = num / 1000 % 10;
            e = num / 10000 % 10;
            f = num / 100000 % 10;
            g = num / 1000000;
            if(num == pow(a,7) + pow(b,7) + pow(c,7) + pow(d,7) + pow(e,7) + pow(f,7) + pow(g,7))
            {
                s[time]=num;
                time++;
            }
        }
    }
    for(i=0;i<time;i++)
    {
        printf("%d",s[i]);
        if(i<time)
            printf("\n");
    }
    return 0;
}

自我感觉太繁琐了,并且在提交的时候运行时间超出了规定时间,其余均正确。我在想当你等于一共数字的时候,既然运算方法是类似的,那么能不能用一个循环语句来代替冗长的代码呢?于是我就写了如下的循环语句,但是语法和逻辑可能不对。想请教一下您,有没有一种解决方法?

#include<stdio.h>
#include<math.h>
int main()

{


    int a[10]={1,2,3,4,5,6,7,8,9,0};
//    int b[7]={0};
    int s[10000]={0};
    int time=0,i,n,t,num;
    scanf("%d",&n);
    num = pow(10,n-1)+1;
    for(i=0;i<10;i++)
    {
        if(n == a[i])
            for(t=0;num<pow(10,n);t++,num++)
        {
            int j,k,c,d,e,f,g;
            j = num % 10;
            k = num / 10 % 10;
            c = num / 100 % 10;
            d = num / 1000 % 10;
            e = num / 10000 % 10;
            f = num / 100000 % 10;
            g = num / 1000000;
            if(num == pow(j,7) + pow(k,7) + pow(c,7) + pow(d,7) + pow(e,7) + pow(f,7) + pow(g,7))
            {
                s[time]=num;
                time++;
            }
        }

    }
    for(i=0;i<=time;i++)
    {
        printf("%d",s[i]);
        if(i<time)
            printf("\n");
    }

    return 0;
}


  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-21 18:56
    关注

    【以下回答由 GPT 生成】

    这段代码的功能是输出指定位数的水仙花数。代码中使用了一个数组s来存储水仙花数,时间复杂度较高。

    如果需要改进这段代码,可以采用以下方案:

    1. 将输入的N作为函数参数传入,代替从标准输入中读取。
    2. 通过for循环遍历所有可能的N位数,计算每个位数的N次幂之和。
    3. 判断该数是否等于它本身,如果是则输出。
    4. 使用递归调用函数本身,对下一个位数进行计算,直到达到N位数为止。
    5. 将输出的水仙花数按递增顺序排序后返回。

    以下是改进后的代码示例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    // 定义快速排序函数
    int compare(const void *a, const void *b)
    {
        return (*(int *)a - *(int *)b);
    }
    
    // 递归函数计算水仙花数
    void narcissistic(int num, int n, int *nums, int *index)
    {
        if (n == 0)
        {
            nums[*index] = num;
            (*index)++;
            return;
        }
    
        for (int i = 0; i <= 9; i++)
        {
            narcissistic(num + pow(i, n), n - 1, nums, index);
        }
    }
    
    int main()
    {
        int N;
        scanf("%d", &N);
    
        // 计算水仙花数
        int *nums = (int *)malloc(pow(10, N) * sizeof(int));
        int index = 0;
        narcissistic(0, N, nums, &index);
    
        // 排序并输出水仙花数
        qsort(nums, index, sizeof(int), compare);
        for (int i = 0; i < index; i++)
        {
            printf("%d\n", nums[i]);
        }
    
        free(nums);
    
        return 0;
    }
    

    这段代码使用了递归的方式计算水仙花数,并且在计算过程中保存结果到一个动态分配的数组中。最后使用快速排序对结果进行排序,并按递增顺序输出。



    【相关推荐】


    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/239955
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题。

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

报告相同问题?

问题事件

  • 创建了问题 10月21日

悬赏问题

  • ¥20 两个不同Subnet的点对点连接
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)
  • ¥66 比特币地址如何生成taproot地址