akakkajijiij 2022-12-08 10:27 采纳率: 100%
浏览 153
已结题

c语言课程设计特殊数据的输出

请编写程序,由系统随机产生一个正整数 n(1<n<50000),根据菜单提示,选择输出小于 n 的以下 7 种特殊数据中的一种:(1)完全数,(2)亲密数,(3)水仙花数,(4)阶乘和数,(5)自守数,(6)孪生素数;直到用户退出系统。
【功能要求】
1、采用 1 行输出 5 个数据的格式。
2、主函数实现正整数 n 的随机产生和菜单的显示,如图1所示。数据 n 作为函数的实参传递给各个子函数。
3、子函数实现 1 到 n 之间的特殊数据的判断和输出,不同类型特殊数据的判断用不同子函数实现。
【难点与提示】
1、各类特殊数据的解释如下
(1)完全数是恰好等于自身的因子之和的数,例如 6 是完全数,因为6=1*2*3=1+2+3。
(2)亲密数是两个正整数,其中一个整数的全部因子之和等于另一个(因子中不计本身),例如 220 和 284 是亲密数, 因为 220 的全部因子是 1,2,4,5,10,11,20,22,44,55,110,和为 284;而 284 的全部因子是 1,2,4,71,142,和为 220。
(3)水仙花数是恰好等于自身各位数字立方和的数,例如 153 是水仙花数,因为153=13+53+33。
(4)阶乘和数是恰好等于自身各位数字阶乘的和的数,例如 145 是阶乘和数,因为145=1!+4!+5!。
(5)自守数是平方后尾部数字是自身的数,例如 9376 是,因为 93762=87909376。
(6)孪生素数是差 2 的两个素数,例如 197 和 199。
2、建议编写一个函数求出某数的因子和,以减少求完全数和亲密数函数中的重复代码。
3、自守数中整数 x 尾部数字的求法:x%10 表示 x 的最后一位数字,x%100 表示 x 的最后两位数字,x%1000 表示 x 的最后三位数字,以此类推。
4、C 编译器提供了基于 ANSI 标准的伪随机数发生器函数 rand()和 srand(),用来生成随机数。这二个函数的工作过程如下:
srand()提供一个种子,它是一个 unsigned int 类型,其取值范围从 065535;
然后调用 rand(),它会根据提供给 srand()的种子值返回一个随机数(在 0 到 32767 之间);
根据需要多次调用 rand(),从而不间断地得到新的随机数;
无论什么时候,都可以给 srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
例 1 是 0
32767 之间的随机数程序: 例 1:#include <stdlib.h>
#include <stdio.h>
#include <time.h> //使用当前时钟做种子void main( void )
{
int i;
srand( (unsigned)time( NULL ) ); //初始化随机数for( i = 0; i < 10;i++ ) //打印出 10 个随机数
printf( " %d\n", rand() );
}
参照上述程序随机生成正整数 n(1<n<50000)。

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-12-08 10:39
    关注
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    //指数
    int power(int n,int k)
    {
        int m = 1;
        for(int i=1;i<=k;i++)
            m*=n;
        return m;
    }
    
    //素数
    int isprime(int n)
    {
        if(n<2)
            return 0;
        for(int i=2;i*i<=n;i++)
            if(n%i==0)
                return 0;
        return 1;
    }
    
    //阶乘
    int jc(int n)
    {
        int m=1;
        for(int i=1;i<=n;i++)
            m*=i;
        return m;
    }
    
    //因子和
    int yzh(int n)
    {
        int sum = 0;
        for(int i=1;i<n;i++)
            if(n%i==0)
                sum += i;
        return sum;
    }
    
    //计算位数
    int nums(int n)
    {
        int m = 0;
        while(n>0)
        {
            m++;
            n/=10;
        }
        return m;
    }
    /////////////////////
    //安全数
    void Perfect(int n)
    {
        int count = 0;
        for(int i=1;i<=n;i++)
        {
            if(yzh(i) == i)
            {
                count++;
                printf("%d ",i);
                if(count % 5==0)
                    printf("\n");
            }
        }
        if(count % 5 != 0)
            printf("\n");
    }
    //亲密数
    void Amicable(int n)
    {
        int count = 0;
        for(int i=1;i<=n;i++)
        {
            int m = yzh(i);
            int k = yzh(m);
            if(i==k)
            {
                count++;
                printf("%d ",i);
                if(count % 5==0)
                    printf("\n");
            }
        }
        if(count % 5 != 0)
            printf("\n");
    }
    
    //水仙花数
    void Narcissistic(int n)
    {
        int count = 0;
        for(int i=1;i<=n;i++)
        {
            int m = nums(i);
            int sum = 0;
            int k = i;
            while(k>0)
            {
                sum += power(k%10,m);
                k/=10;
            }
            if(sum == i)
            {
                count++;
                printf("%d ",i);
                if(count % 5==0)
                    printf("\n");
            }
        }
        if(count % 5 != 0)
            printf("\n");
    }
    
    //阶乘和
    void jcsum(int n)
    {
        int count = 0;
        for(int i=1;i<=n;i++)
        {
            int sum = 0;
            int k = i;
            while(k>0)
            {
                sum += jc(k%10);
                k/=10;
            }
            if(sum == i)
            {
                count++;
                printf("%d ",i);
                if(count % 5==0)
                    printf("\n");
            }
        }
        if(count % 5 != 0)
            printf("\n");
    }
    
    void autoguard(int n)
    {
        int count = 0;
        for(int i=1;i<=n;i++)
        {
            long long m = i*i;
            if(m%power(10,nums(i)) == i)
            {
                count++;
                printf("%d ",i);
                if(count % 5==0)
                    printf("\n");
            }
        }
        if(count % 5 != 0)
            printf("\n");
    }
    
    void twinprime(int n)
    {
        int count = 0;
        for(int i=1;i<=n-2;i++)
        {
            if(isprime(i) && isprime(i+2))
            {
                count++;
                printf("%d ",i);
                if(count % 5==0)
                    printf("\n");
            }
        }
        if(count % 5 != 0)
            printf("\n");
    }
    
    void menu()
    {
        printf("****************************\n");
        printf("        1.输出完全数\n");
        printf("        2.输出亲密数\n");
        printf("        3.输出水仙花数\n");
        printf("        4.输出阶乘和数\n");
        printf("        5.输出自守数\n");
        printf("        6.输出孪生素数\n");
        printf("        0.退出\n");
        printf("****************************\n");
    }
    
    int main()
    {
        srand(time(NULL));
        while(1)
        {
            system("cls");
            int n = rand()%50000+1;
            printf("请输入n:%d\n",n);
            menu();
            printf("请输入选择:");
            int sel;
            scanf("%d",&sel);
            switch(sel)
            {
            case 1:
                Perfect(n);
                break;
            case 2:
                Amicable(n);
                break;
            case 3:
                Narcissistic(n);
                break;
            case 4:
                jcsum(n);
                break;
            case 5:
                autoguard(n);
                break;
            case 6:
                twinprime(n);
                break;
            case 0:
                return 0;
            default:
                printf("输入错误!\n");
                break;
    
            }
            system("pause");
            
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄