C:编程练习2-1:循环结构(复习)

本人C语言现已初步学成函数的内容

本次所取习题链接:link(我支持版权的喔)


题目一

1、输出所有的“水仙花数”。所谓“水仙花数”,是指一个3位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为\tiny 153=13+53+3^3。

我答案如下:
#include<stdio.h>
main()
{
    printf("以下为水仙花数\n");
    int a,b,c,x;
    for(a=1;a<=9;a++)
    {
        for(b=0;b<=9;b++)
        {
            for(c=0;c<=9;c++)
            {
                x=a*100+b*10+c;
                if(x==a*a*a+b*b*b+c*c*c)
                    printf("%d\n",x);
            }
        }
    }
    system("pause");
}
讲解:

这题我采用了3个循环的嵌套,尽管老师说过最好不要大量使用循环的嵌套,虽然我现在还不知道为什么,但我感觉这样子简单呀。
第一个for循环用来组成百位的1~9;
第二个for循环用来组成十位的0~9;
第三个for循环用来组成个位的0~9;
由for循环的特性,我就可以测试100~999中的所有数是否为水仙花数。自我感觉这个思路还是非常清晰滴。


题目二

2、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子是1,2,3,而6=1+2+3,因此6是完数。编程求出1000以内的所有完数。并按下面格式输出其因子:6 its factors are 1 2 3

我答案如下:
#include<stdio.h>
main()
{
    printf("接下来会输出1000以内的完数\n");
    int a[5];
    for(a[0]=1;a[0]<=1000;a[0]++)
    {
        for(a[2]=0,a[1]=1;a[1]<a[0];a[1]++)
          {
             if(a[0]%a[1]==0)
                a[2]+=a[1];
          }
        if(a[2]==a[0])
        {
            printf("完数为%d its factors are(除去本身)\t",a[0]);
            for(a[1]=1;a[1]<a[0];a[1]++)
            {
                if(a[0]%a[1]==0)
                    printf("%d\t",a[1]);
            }
            putchar('\n');
        }
    }
}

在做这一题时,我刚学会使用数组的定义,所以就使用了一点点的数组知识。很多同学在那个时候都无法将完数的因子给输出来,尽管我成功的输出了,但我使用的却是最蠢的方法,就是再跑一遍,其实应该还可以再简化一点点的。

现用所学知识修改后:
#include<stdio.h>
#define N 30
main()
{
    printf("接下来会输出1000以内的完数\n");
    int i,j,k,h,a[N];
    for(i=1; i<=1000; i++)
    {
        for(h=0,k=0,j=1; j<i; j++)
            if(i%j==0)
                k+=a[h++]=j;
        if(k==i)
        {
            printf("%d its factors are\t",i);
            for(k=0; k<h; k++)
                printf("%d\t",a[k]);
            putchar('\n');
        }
    }
}

在编写完数的程序时,我们小心诸如24这类的非完数。很多同学编程序时,一不小心就会冒出这个数来。然而心思缜密的同学便会知道,我们需要将可余数全加起来才能去比较,否则就会有一些鱼目混珠的数混进来喔。


今天到这就结束了,不知道各位大神是否还有更好的方法,请赐予我吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值