本人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这类的非完数。很多同学编程序时,一不小心就会冒出这个数来。然而心思缜密的同学便会知道,我们需要将可余数全加起来才能去比较,否则就会有一些鱼目混珠的数混进来喔。
今天到这就结束了,不知道各位大神是否还有更好的方法,请赐予我吧。