内容纲要
打印所有的水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数。
例如,153就是一个水仙花数,因为153=111+555+333
思考:
一、所有的水仙花数,也就是确定范围100-999。
二、遍历100-999,要找的数按位表示使用 i/100, i/10, i%10
三、判断条件就是 i==(i/100)(i/100)(i/100)+(i/10)(i%100/10)(i%100/10)(i%100/10)+(i%100%10)(i%100%10)*(i%100%10)
四、Q:这样的判断条件明显太过繁琐,能否简化?
A: 1.宏定义百位、十位、个位。 见程序 ②
2.把三位数,每一位单独来看,不当作整体。见程序 ③
(注:这种方法用了三个循环嵌套是否复杂度会更高?本次在写程序时先赋值sum,导致在遍历时sum值恒定,下次务必记住)
程序:
① 基础版本
#include <stdio.h>
int main(void) {
int i = 0;
for (i = 100; i <= 999; i++)
{
if (i == (i / 100) * (i / 100) * (i / 100) + (i % 100 / 10) * (i % 100 / 10) *
(i % 100 / 10) + (i % 100 % 10) * (i % 100 % 10) * (i % 100 % 10))
printf("%d\n", i);
}
}
②宏定义函数版本
#include <stdio.h>
#define bai(i) (i/100)
#define shi(i) (i%100/10)
#define ge(i) (i%100%10)
int main(void) {
int i = 0;
for (i = 100; i <= 999; i++) {
if (i == bai(i)*bai(i)*bai(i) + shi(i)*shi(i)*shi(i) + ge(i)*ge(i)*ge(i))
printf("%d\n", i);
}
}
③每位单独来看
#include <stdio.h>
int main(void) {
int a = 1, b = 0, c = 0;
int sum = 0;
for (a = 1; a <= 9; a++) {
for (b = 0; b <= 9; b++) {
for (c = 0; c <= 9; c++) {
sum = a * 100 + b * 10 + c;
if (sum == (a * a * a + b * b * b + c * c * c))
printf("%d\n", sum);
}
}
}
}