根据百度百科里面的定义:
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。
输出10000以内的水仙花数。
分析: 取出每一位上的数字
只要能把n的每一位数字取出,即:n1,n2,n3……再得出数字的位数 m 即可
然后判断 n1^m+n2^m+n3^m……是否等于n。如果等于则是水仙花数,输出。
关键点:怎样取数?怎样确定位数?
n%10可以得到各位上的数字,然后把各位少数字抹掉,继续n%10又可以得到最后一位,以此类推
例如:对于数字12345 12345%10=5 抹掉后面的5 得1234,继续%10 得1234%10=4,以此类推
这样抹掉最后一位数呢?根据整除的特点 12345整除10 即为 1234,以此类推
至于位数,把n每次整除10;直到结果变为0,记录整除了多少次,就是多少位数。(也可以使用数学方法 取对数,logn 取整数即为位数,为了练习写程序,就不用这个方法了)
先写个简单的:
输出100~999中的水仙花数
这里确定了位数,就比较好办了,只需要验证:
(n%10)^3+((n/10)%10)^3+(n/100)^3是否等于n即可
代码:
#include<iostream>
#include <math.h>
using namespace std;
int main() {
int a,b,c;
for (int i = 100; i <= 999; i++) {
a=i%10;//取出个位
b=(i/10)%10;//取出十位
c=i/100;//取出百位
//math中的pow函数可以求幂
if(pow(a,3)+pow(b,3)+pow(c,3)==i){
cout<<"水仙花数:"<<i<<endl;
}
}
return 0;
}
/*
* 水仙花数:153
* 水仙花数:370
* 水仙花数:371
* 水仙花数:407
*/
进一步,完成题目所要求的内容
#include <iostream>
#include<math.h>
using namespace std;
/*水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。*/
int main() {
int nMax = 10000;//上限
int n = 0;//待检测的数字
int nDigit = 0;//位数
int sum=0;//每位数字的幂之和
for (int i = 100; i <= nMax; i++) {
n = i;//待检测的数字
//求位数//
nDigit=0;//n的位数
int number=i;
while (number) {
//小于10的自然数数整除10结果0;
number = number / 10;
nDigit++;
}
sum=0;
do{
sum=sum+pow(n%10,nDigit);//计算最后一位数字的幂
n=n/10;//整除10,将最后一位数字去掉
}while(n);//如果n不为0,则继续循环
if(sum==i){//如果与原数相等则是水仙花数
cout<<"水仙花数: "<<i<<endl;
}
}
return 0;
}
在这个程序中,石油了do。。。while 循环,也可以使用其他循环