求水仙花数
定义:水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
根据定义可知 目标是求出该数数位3次方之和然后和本身比较 和本身相同则是水仙花数。
考虑如何获取数位数值
暴力获取法
int a = tmp % 10;//取模获取个位 tmp 为3位数临时值 int b = (tmp / 10) % 10;//去掉个位 取模获得十位 int c =(tmp / 100) % 10;//去掉个位 十位 取模获得百位
循环判断进行比较 符合定义则打印
for(int i = 100;i <= 999;i++) { int tmp = i;//为了后续比较 使用tmp接收i值 //获取个位十位百位值 如上 if((a * a * a + b * b * b + c * c * c)==i) { printf("%d ",i); } }
完整代码
#include <stdio.h> int main() { for (int i = 100; i <= 1000; i++) { int tmp = i; int a = tmp % 10; int b = (tmp / 10) % 10; int c = (tmp / 100) % 10; if ((a * a * a + b * b * b + c * c * c) == i) { printf("%d ",i); } } return 0; }
水仙花数plus版本(求1-10000内符合定义的数)
此时就不再是求水仙花数,而是求 数位*位数等于本身的数!
因为位数不同 所以次方也会不同 第一步就需要求位数
一、求位数
把i赋值给tmp 每次符合循环条件位数++ 循环结束 获得位数
int count = 1;//使用count 来当做位数 int tmp = i; while(tmp / 10)//因为count定义时是1 故把tmp/10作为循环条件 { count++;//最终获得位数 tmp /= 10; }
二、求数位对应的值
使用pow函数计算出每一个位数对应表的值,使用sum求和
每求完一个位数之后 tmp/10 使得求下一位数对应的值
int tmp;//注意这个位置 需要二次赋值 while(tmp) { sum += pow(tmp % 10,count);//使用函数(需要加头文件math.h) pow(值,次方值) tmp /= 10; }
三、符合条件打印
if(sum == i) { printf("%d ",i); }
总代码
#include <stdio.h> #include <math.h> int main() { for (int i = 1; i < 100000; i++) { int count = 1; int sum = 0; int tmp = i; while (tmp / 10) { count++; tmp /= 10; } tmp = i; while (tmp) { sum += pow(tmp % 10, count); tmp /= 10; } if (sum == i) { printf("%d ", i); } } return 0; }