水仙花数及其扩展应用
1.求出0~999之间的所有“水仙花数”并输出。
“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=13 +53 +33 ,则153是一个“水仙花数”。
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int i = 0;
for (i = 100; i < 1000; i++)
{
a = i % 10;//个位
b = i / 10 % 10;//十位
c = i / 100;//百位
if (i == a*a*a + b*b*b + c*c*c)
{
printf("%d\n", i);
}
}
system("pause");
return 0;
}
扩展水仙花数:求1-100000000中的水仙花数,其中
100-999为每位数字的三次方之和,而,
1000-9999为每位数字的四次方
10000-99999为每位数字的五次方
……
以此类推
#include <stdio.h>
#include <math.h>
int main()
{
int i,j;
int sum = 0;
int n = 1;
int addflag = 10;
for (i = 1; i < 100000000; i++)
{
if (i == addflag)
{
n++;//进位后给次方+1
addflag *= 10;
}
for (j = i; j; j /= 10)//数位遍历,将每个数位取出
{
sum += pow(j % 10, n);
}
if (sum==i)
{
printf("%d\n", sum);
}
sum = 0;
}
system("pause");
return 0;
}
该程序使用了剥离数位这个"套路",使得程序简单了很多。
剥离数位:可以将给定数字的每一位取出来,反向排列。常用于进制转换,取数位中
#include <stdio.h>
#include <math.h>
//对给定的数进行数位的交换
int main()
{
int i;
int n = 1234;
for (i = n; i; i /= 10)
{
printf("%d\n", i%10);
}
system("pause");
return 0;
}
结果:
扩展使用:对数字进行数位交换,可用于判断是否为回文数
#include <stdio.h>
#include <math.h>
//对给定的数进行数位的交换
int main()
{
int i;
int n = 1234;
int sum = 0;
for (i = n; i; i /= 10)
{
sum = sum * 10 + i % 10;
}
printf("%d\n", sum);
system("pause");
return 0;
}