【问题描述】编写一个程序,输入一个正整数N(N大于等于100小于等于999),求出100~N之间的所有水仙花数。所谓 的水仙花数是:如果一个三位数的个位数、十位数、百位数的立方和等于该数自身,就称这个数为水仙花数。
【输入形式】输入一个正整数N。
【输出形式】输出从100到N之间的所有水仙花数,每个数以回车结束。
【样例输入】
400
【样例输出】
153
370
371
【样例说明】输入一个的正整数400,输出为100~400之间的水仙花数153,370,371
-------------------
个人代码:
#include <stdio.h> void geteach(int n,int *a){ int i; for(i=0;i<3;i++){ a[i] = n%10;//a[0]为最低位 n/=10; } } void check(int n,int *a){ int i,sum=0; for(i=0;i<3;i++){ sum = sum + a[i]*a[i]*a[i]; } if(sum == n) printf("%d\n",n); } int main(){ int num,i,a[3]; scanf("%d",&num); for(i=100;i<=num;i++){ geteach(i,a); check(i,a); } getchar(); return 0; }
标答:
#include <stdio.h> int test(int num); #define threetimes(n) ((n)*(n)*(n)) main() { int i,max,shui[1024],j; scanf("%d",&max); for(i=153,j=0;i<=max;i++) { if(test(i)==1) { shui[j]=i; j++; } } for(i=0;i<j;i++) { printf("%d\n",shui[i]); } } int test(int i) { int ge,shi,bai,lifanghe; ge=i%10; shi=(i%100-ge)/10; bai=(i-shi*10-ge)/100; lifanghe = threetimes(ge)+ threetimes(shi)+ threetimes(bai); if (lifanghe == i) { return 1; } else { return 0; } }
--------------------
1、用宏定义来精简代码
#define threetimes(n) ((n)*(n)*(n))
2、自己写的代码中尝试使用函数调用,并以数组为形参。
函数声明:void geteach(int n,int *a){...;...;}
函数调用:geteach(i,a);
其中a[3]为int型数组