正文

[036] 完数2006-03-12 22:14:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/10946.html

分享到:

<谭> 6.7 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程找出1000之内的所有完数,并按下面格式输出其因子:6  Its factors are 1,2,3#include <stdio.h>const int M = 1000; /* 定义寻找范围 */int   main(){    int k1, k2, k3, k4, k5, k6, k7, k8, k9, k10;    int i, a, n, s;    for (a = 2; a <= M; a++)    {        n = 0; /* n累计因子的个数 */        s = a; /* s存放未求出的因子之和,初值为被测数本身 */        for (i = 1; i < a; i++)             if (a % i == 0)     /* 由i到a循环检测i是否为a的因子 */            {                n++;            /* 找到一个因子 */                s = s - i;      /* 减去已找到的因子 */                switch (n)      /* 将找到的因子赋绐k1, k2, ... */                {                case 1  : k1 = i; break;                case 2  : k2 = i; break;                case 3  : k3 = i; break;                case 4  : k4 = i; break;                case 5  : k5 = i; break;                case 6  : k6 = i; break;                case 7  : k7 = i; break;                case 8  : k8 = i; break;                case 9  : k9 = i; break;                case 10 : k10 = i; break;                }            }        if (s == 0) /* 已经找到全部因子 */        {            printf("%d Its factors are ", a);            if (n > 1) printf("%d,%d", k1, k2); /* n>1表示a至少有2个因子 */            if (n > 2) printf(",%d", k3); /* 注意以下if的用法,追加的方法 */            if (n > 3) printf(",%d", k4);            if (n > 4) printf(",%d", k5);            if (n > 5) printf(",%d", k6);            if (n > 6) printf(",%d", k7);            if (n > 7) printf(",%d", k8);            if (n > 8) printf(",%d", k9);            if (n > 9) printf(",%d", k10);            printf("\n");        }    }    return 0;}运行结果:======================================================6 Its factors are 1,2,328 Its factors are 1,2,4,7,14496 Its factors are 1,2,4,8,16,31,62,124,248======================================================★ 显然这是一种比较繁琐的方法, 其中的开关语句switch用的有些牵强, 因为因子数的个数是不确定的, 通过预置10个,本题可以,可如果要验证更多时便无法确定, 一味增加它的个数也不是办法。书上还提到了用数组的方法更简单,不过只是用一个数组放k[11]来存放因子,这个11仍是人为预置的,和上述方法类似,只是形式上的简单而已,虽然对于本题来说没必要动态申请之类的,但我并不认为这是个好办法。虽然我没有更好的办法 ^_^#include <stdio.h>const int M = 1000;int   main(){    int k[11];    int i, a, n, s;    for (a = 2; a <= M; a++)    {        n = 0;        s = a;        for (i = 1; i < a; i++)            if (a % i == 0)            {                n++;                s = s - i;                k[n] = i;            }        if (s == 0)        {            printf("%d Its factors are ", a);            for (i = 1; i < n; i++)                printf("%d,", k[i]);            printf("%d\n", k[n]);        }    }    return 0;}结果同上。★ 另一种方法#include <stdio.h>const int M = 1000;int   main(){    int m, s, i;    for (m = 2; m < M; m++)    {        s = 0; /* s为因子之和 */        for (i = 1; i < m; i++)            if ((m % i) ==0) s = s + i; /* i为因子 */        if (s == m)        {            printf("%d Its factors are ", m);            for (i = 1; i < m; i++)                if (m % i == 0) printf("%d,", i);            printf("\n");        }    }    return 0;}运行结果:======================================================6 Its factors are 1,2,3,28 Its factors are 1,2,4,7,14,496 Its factors are 1,2,4,8,16,31,62,124,248,======================================================★ 比题目要求的多了个",", 当然和程序功能没啥关系啦, 如果非得要用题目的方式的话还要改的繁琐点, 加个计数器k, 第一次找因子循环时,记下因子的个数k, 输出的时候先输出k-1个因子,最后一个因子单独输出,就是为了最后那个逗号,没啥意义……#include <stdio.h>const int M = 1000;int   main(){    int m, s, i;     for (m = 2; m < M; m++)    {        int k = 0, t = 0;        s = 0; /* s为因子之和 */        for (i = 1; i < m; i++)            if ((m % i) ==0)            {                s = s + i; /* i为因子 */                k++;            }        if (s == m)        {            printf("%d Its factors are ", m); /* 可在此输出因子的个数k */            for (i = 1; i < m; i++)                if (m % i == 0)                {                    t++;                     if (t < k)     /* 通过两次计数比较区分最后一个因子 */                         printf("%d,", i);                    else                         t = i;       /* 最后一个因子赋给t, 此时t失去本意 */                }            printf("%d\n", t);        }    }    return 0;}运行结果:======================================================6 Its factors are 1,2,328 Its factors are 1,2,4,7,14496 Its factors are 1,2,4,8,16,31,62,124,248======================================================

阅读(8640) | 评论(6)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册