用C语言编写一个程序,验证输入的身份z是否合法?

用C语言编写一个程序,验证输入的身份z是否合法?,第1张

源程序如下:

#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,调试很不错,可以随时看某个变量的值是怎样变化的,进而查出问题的根源,对学习很有帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8114072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存