水仙花数,即各个位上的数的立方和等于这个数本身。
我写的解法如下:
#include <stdio.h>
int main()
{
int a,b,c,d,i;
for(i=0;i<1000;i++)
{
for(a=100;a<=999;a++)
{
b=(a/100)%10;
c=(a/10)%10;
d=a%10;
if(a==(b*b*b+c*c*c+d*d*d))
{
printf("Armstrong:%d\n",a);
}
}
}
return 0;
}
此为传统解法
另一种解法:
#include <stdio.h>
void main(void)
{
int p, q, r; /* three digits */
int p_cube, q_cube, r_cube; /* their cubes */
int p100, q10; /* their position values */
int number; /* the computed number */
int cube_sum; /* the sum of the cubes */
int count = 0; /* counter */
printf("\nArmstrong Number Search");
printf("\n=======================");
printf("\n\nCount Number");
printf( "\n----- ------");
for (p = 1, p100 = 100; p <= 9; p++, p100+=100) {
p_cube = p*p*p;
for (q = q10 = 0; q <= 9; q++, q10+=10) {
q_cube = q*q*q;
for (r = 0; r <= 9; r++) {
r_cube = r*r*r;
number = p100 + q10 + r;
cube_sum = p_cube + q_cube + r_cube;
if (number == cube_sum)
printf("\n%3d%9d", ++count, number);
}
}
}
printf("\n\nThere are %d 3-digit Armstrong Numbers.", count);
}
对比:
分别对此两种解法进行1000此循环后,测试运行时间
解法1,耗时0.115s
解法2,耗时0.066s
这两种解法的思路是完全相反的:
解法1是对已知数进行分解,然后进行立方和运算后与原值做比较,判断是不是水仙花数。解法二是先对各个位的数进行立方和运算,然后把它组合成一个三位数进行判断,少了分解的步骤,故节省系统开销。
解法1总共进行了900次循环,而解法2循环了1000此,在循环次数多的情况下耗时反而少,解法2的优势很明显