源程序如下:
#include"stdio.h"
voidmain()
{
inti /*身份z的第i位*/
ints[17] /*定义一个数组用来存放身份z的前17位*/
intt[17] /*各位相乘后的数组*/
intm /*余数*/
intt18 /*身份z的第18位0--9*/
chart18c /*身份z的第18位X*/
longintsum=0
for(i=0i<17i++)
{
printf("请输入身份z的第%d位:",i+1);
scanf("%d",&s[i])
switch(i+1)
{
/*身份z的1到17位要乘的数一次是7910584216379105842*/
case1:t[i]=s[i]*7break
case2:t[i]=s[i]*9break
case3:t[i]=s[i]*10break
case4:t[i]=s[i]*5break
case5:t[i]=s[i]*8break
case6:t[i]=s[i]*4break
case7:t[i]=s[i]*2break
case8:t[i]=s[i]*1break
case9:t[i]=s[i]*6break
case10:t[i]=s[i]*3break
case11:t[i]=s[i]*7break
case12:t[i]=s[i]*9break
case13:t[i]=s[i]*10break
case14:t[i]=s[i]*5break
case15:t[i]=s[i]*8break
case16:t[i]=s[i]*4break
case17:t[i]=s[i]*2break
}
sum=sum+t[i]
}
printf("前17位相乘后的和为%ld\n",sum)
m=sum%17
printf("对17取余后的值位:",m)
switch(m)
}
/*各个余数所对应第18位身份z号10X98765432*/
case0:t18=1printf("这是一个合法的身份z号码,第18位是%d",t18)break
case1:t18=0printf("这是一个合法的身份z号码,第18位是%d",t18)break
case2:t18c='X'printf("这是一个合法的身份z号码,第18位是%c",t18c)break
case3:t18=9printf("这是一个合法的身份z号码,第18位是%d",t18)break
case4:t18=8printf("这是一个合法的身份z号码,第18位是%d",t18)break
case5:t18=7printf("这是一个合法的身份z号码,第18位是%d",t18)break
case6:t18=6printf("这是一个合法的身份z号码,第18位是%d",t18)break
case7:t18=5printf("这是一个合法的身份z号码,第18位是%d",t18)break
case8:t18=4printf("这是一个合法的身份z号码,第18位是%d",t18)break
case9:t18=3printf("这是一个合法的身份z号码,第18位是%d",t18)break
case10:t18=2printf("这是一个合法的身份z号码,第18位是%d",t18)break
default:printf("这不是一个合法的身份z号码")
}
printf("\n")
}
VC++6.0测试如下(输入一位后按回车输入第二位数)。
LZ你好~首先你要理解啥是水仙花数:
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)
以上来自百度百科。
按照楼主的程序,有3层循环,姑且叫做a循环,b循环,c循环。
我们先从循环上下界和条件来看:
楼主用a循环代表个位数,用b循环代表10位数,c循环代表百位数,对嘛?假设是这种情况,让我们先不看代码。
事实上a循环是最外面的循环,c循环是最里面的循环,而计数按照逻辑应该是 111,112,113这样增长的,所以逻辑上应该反过来,a代表百位数,b代表10位数,c代表个位数。(其实您的方式也可以遍历所有您想遍历的数,只不过从逻辑上变成111,211,311...911,121,221...这样了,但是不觉得很不舒服嘛~)
然后我们来分析代码,结构很明白了:
a循环,百位数
{
b循环,十位数
{
c循环,个位数
{
验证
}
}
}
然后我们来确定验证:
一个水仙花数n,假设是1000以内的3位数,写作abc也就是 n = a*100 + b*10 + c = a^3 + b^3 + c^3,这不就是验证条件嘛?所以条件就是a*100 + b*10 + c = a*a*a + b*b*b + c*c*c
然后来看循环上下界,百位数可以从1-9,十位数可以从0-9,个位可以从0-9,这时候程序就完成了啦。
楼主在确定上下界的时候犯了错哦,十位数不可以当做10到99,你要单纯的将她看成数字,因为十位数只可能出现0-9,这10种情况,而不会出现11,23,56这样的情况吧?
所以关键的循环体应该是:
for(a=1a<=9a++)
{
for(b=0b<=9b++)
{
for(c=0c<=9c++)
{
if(a*100 + b*10 + c == a*a*a + b*b*b + c*c*c)
{
printf("%d,%d,%d\n",a,b,c)
}
}
}
}
我把大括号全带上了,请养成良好的编程习惯哦~
当然你也可以把最后验证部分(if部分)替换成三元表达式,使用某一些编译器效率会提高一点:
for(a=1a<=9a++)
for(b=0b<=9b++)
for(c=0c<=9c++)
a*100 + b*10 + c == a*a*a + b*b*b + c*c*c ? printf("%d,%d,%d\n",a,b,c):// 注意有个':'
刚学C语言要抓住几个重要的知识点,一个是三大结构,二是数组,三是函数,四是指针,然后结构体,最后把学生管理系统写出来就差不多了,至于编写程序的正确性,可以通过调试,推荐vc6.0,调试很不错,可以随时看某个变量的值是怎样变化的,进而查出问题的根源,对学习很有帮助。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)