BitTigerio 2017-12-26
昨天,雷老师偶有闲致,评讲了n周前的C程序设计作业。其中讲到了一到求水仙花数的题,给出了一种漂亮的算法,在此记录下来。
输出所有的水仙花数,所谓水仙花数是指一个3位数,其各位数字立方和等于该数本身。
①将数除以100,由整型数据特点,小数点后被忽略,取得百位a。
②该数减去a * 100,除以10,得到十位b。
③该数减去a * 100和b * 10即得个位c。
a = i / 100; b = (i - 100 * a) / 10; c = i - 100 * a - 10 * b;
完整代码:
void NarcissusNumber(int m) {
int a; //三位数的百位
int b; //三位数的十位
int c; //三位数的个位
int d; //各位数字立方和与数的差值
a = m / 100;
b = (m - 100 * a) / 10;
c = m - 100 * a - 10 * b;
d = a*a*a + b*b*b + c*c*c - m;
if (d==0) //各位数字立方和与数相等,输出
{
printf("%d\n", m);
}
}①将数除以10取余数得个位c
②将数除以10后再与10取余得到十位b
③将该数除以100再与10取余得到百位a
int c = n % 10; //个位 int b = n / 10 % 10; //十位 int a = n / 100 % 10; //百位,或者写int c = n / 100;
①将数除以10取余数得个位c,将该数除以10
②重复①得到十位b
③继续重复①得到百位a
int sum = 0; //求和变量
int temp=i; //存放数值i,防被覆盖而丢失
int rem; //余数
for (int j = 0; j < 3; j++)//第一次循环得到个位立方和,第二次循环得到个位与十位立方和...
{
rem = temp % 10;
temp /= 10;
sum += rem * rem*rem;
}//输出水仙花
void NarcissusNumber()
{
for (int i = 100; i < 1000; i++)
{
int sum = 0;
int temp=i;
int rem;
for (int j = 0; j < 3; j++)
{
rem = temp % 10;
temp /= 10;
sum += rem * rem*rem;
}
if (sum == i)
{
printf("%d\n", i);
}
}
}