一.水仙花数(阿姆斯壮数)
1.水仙花数定义
2.代码实现
虽然定义上水仙花数是一个三位数,我们这里要说的代码是一个能求任意范围内的水仙花数的代码。
根据定义,我们知道水仙花数每个位上的数字的该数位数的次幂和等于该数,那么要求水仙花数,就要得先知道该数是几位数。
那怎样求得位数呢?
我们知道求个位上的数字只需拿该数%10就行了,然后再/10,就丢掉了个位,以此类推,很显然,这是一个循环结构,这时我们定义一个记录位数变化的变量n ,每次进入循环时就count++;那么问题来了,怎么控制循环的开始与结束?数字嘛,至少是一位数,而一位数的数字/10=0,因为0为假,非0为真,恰好可以利用这一点来控制循环,具体代码:
1. int main() 2. { 3. int i = 0; 4. int n, m; 5. printf("请输入范围:>"); 6. scanf("%d %d", &n, &m); 7. for(i=n;i<=m;i++) 8. { 9. n = 1; //初始值是1 10. int tmp = i; //使用i但不改变i 11. int sum = 0; //循环完一遍后使sum=0,判断下一次水仙花数 12. while (tmp / 10 != 0) //控制循环 13. { 14. n++; //记录位数 15. tmp = tmp / 10; 16. } 17. 18. } 19. return 0; 20. }
上面代码中的 int sum=0,不能丢,也不能定义成其他的数。位数知道了,接下来就是看每一位的位数幂次方之和是否等于 i 就行了。
可以在嵌套一个循环,定义一个变量并初始化 int sum=0; ,具体代码:
1. int count = n; //使用n但不改变n 2. for (tmp = i; count > 0; count--) //求每位数n次幂加起来的和 3. { 4. sum = sum + pow(tmp % 10, n); 5. tmp = tmp / 10; 6. } 7. if (sum == i) //判断水仙花数 8. { 9. printf("%d ", i); 10. }
全部代码:
二.回文数
1.回文数定义
2.代码实现
回文数正着读倒着读都一样,所以我们如果能判断第1个数字和最后1个数字相同,第2个数字和倒数第2个数字相同.......如果是位数是奇数的话,那中间的数字是不需要判断的,偶数的话,判断前半段和后半段对应的数字相同即可。
好的思路有了,就可以开始写代码了,首先判断位数,这在水仙花数的判断里已经详细讲过了,在这里就不赘述了,详情参照上文。
从思路中我们知道,要判断是否是回文数,需要使用到前面和后面的数字,但不能改变原来的数,所以我们得分别定义两个变量,之后也会用到位数,同理也不能改变位数,所以又需要一个变量,具体变量定义请看下图:
前半部分代码:
1. int main() 2. { 3. int n, m; //输入范围 4. int i,j, count; //i产生n - m之间的数,count记录位数 5. int tmp1, tmp2; //tmp1使用前面的数,tmp2使用后面的数 6. printf("请输入范围:>"); 7. scanf("%d %d", &n, &m); 8. int flag = 0; 9. for (i = n; i <= m; i++) 10. { 11. count = 1; //计算位数 12. tmp1 = i; 13. while (tmp1 / 10 != 0) 14. { 15. count++; 16. tmp1 = tmp1 / 10; 17. } 18. 19. } 20. return 0; 21. }
最关键的部分我们用循环实现。
通过前面的分析我们发现其实不管位数是奇数还是偶数,最终只需要循环 位数的一半,循环一次比较一对数字,所以循环 count/2 次,同理又需要一个新变量来使用 count/2。
要比较一对数字,后面的数字的求法已经在上文提到了,即先%10,再/10;那前面的数字怎么求呢?
比如说123,怎么获取到1呢?
不难发现其实只需要拿123/100就行了,然后123%100得到了23,再拿23/10.......以此类推。
具体代码请看下图:
红框里的都是值得注意的地方。
1红框在上文已经提到;
2红框:如果我们直接把 tmp1/(pow(10,j-1))写在 if 判断中,那最后得到的结果就是错误的;
3,5红框用来判断是不是回文数,如果是的话,那么 flag==count2; 因为如果是回文数的话,那么每一对数字的比较都会进如第1个 if 语句中,循环几次 flag 就等于几;
4红框:为什么这么写呢?直接写成 tmp1=tmp1%pow(10,j-1) 不行吗?
我们来看看 pow 函数的定义:
可以看到 pow 函数的返回值类型是 double ,而%操作符两边的操作数必须是整数,所以才像4红框中那样写。
完整代码:
1. int main() 2. { 3. int n, m; 4. int i,j, count; 5. int tmp1, tmp2; 6. printf("请输入范围:>"); 7. scanf("%d %d", &n, &m); 8. int flag = 0; 9. for (i = n; i <= m; i++) 10. { 11. count = 1; 12. tmp1 = i; 13. flag = 0; 14. while (tmp1 / 10 != 0) 15. { 16. count++; 17. tmp1 = tmp1 / 10; 18. } 19. int a = count / 2; 20. for (j=count,tmp1=i,tmp2=i; a > 0; j--,a--) 21. { 22. int b1 = tmp1 / (pow(10, j - 1)); 23. if(b1==tmp2%10) 24. { 25. flag++; 26. int p1 = pow(10, j-1); 27. tmp1 = tmp1 % p1; 28. tmp2 = tmp2 / 10; 29. } 30. 31. } 32. if (flag == count / 2) 33. { 34. printf("%d ", i); 35. } 36. } 37. return 0; 38. }
一串数字的位数计算方法:
每一位数字的计算方法:
1.从前先后:
先 除10的位数次方,然后取模10的位数次方。
下面是一个6位数的例子:
2.从后向前:
先%10再/10。
例:
😸本篇文章到此结束啦,如有错误或是意见,欢迎小伙伴们的提出。
🐯谢谢你的阅读