c:求1-1000 以内的所有完数

来源:互联网 发布:c语言memset头文件 编辑:程序博客网 时间:2024/05/18 02:07

一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。
现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数。
提示:可以写一个函数来判断某个数是否是完数。
输出格式:
其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一个空行。

#include <stdio.h>#include <stdlib.h>#include <string.h>/*一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数。提示:可以写一个函数来判断某个数是否是完数。输出格式:其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一个空行。*/int isPerfectNumber(int num);int getAllPerfectNumber(int n,int m,int* list);void showPerfectNumbers(int size,int* list);char* itoa(int num,char*str,int radix);int main(int argc, char const *argv[]){    int n = 2,m = 999;    // printf("%s\n", "请输入一个区间的两个端点(1<=n<m<1000):");    // scanf("%d %d",&n,&m);    if(n>=1 && m>n && m<1000){        int* set = (int*)malloc((m-n)*2*sizeof(char*));        int size = getAllPerfectNumber(n,m,set);        printf("size = %d\n", size);        showPerfectNumbers(size,set);        free(set);    }else{        printf("%s %d %d\n","输入的参数不合法:",n,m);    }    return 0;}int isPerfectNumber(int num){    int temp = 0;    for (int i = 1; i < num; ++i)    {        if(num % i ==0){            temp +=i;        }    }    return temp == num;}int getAllPerfectNumber(int n,int m,int* list){    // 1<=n<m<1000    int ret = 0;    if(n<1 || m<=n){        goto end;    }    for (int i = n; i <= m; ++i)    {        if(isPerfectNumber(i)){            ret++;            *list++ = i;            printf("i = %d\n", i);        }    }end:    return ret;}void showPerfectNumbers(int size,int* list){    if(size){        char* output = (char*)malloc(size* 2* sizeof(char*));        *output='\0'; // 初始化为一个空字符串 ""        for (int i = 0; i < size; ++i)        {            char t[5];            itoa(list[i],t,10);            strcat(output,t);            if(i!=size-1){                strcat(output," ");            }else{                strcat(output,"<");            }        }        printf("%s\n", output);        free(output);    }else{        printf("              \n");    }}/*将一个数字转成字符串[来自itoa的百度百科](http://baike.baidu.com/link?url=wiDpiMwWphP2-bXpZCCIo-k_MAXqVa6TlRrn-fgFFZfAypFCvYgpi3KTrEtJfI6yL6wK5nBUTilHn2WOpelje_)*/char* itoa(int num,char*str,int radix){    /*索引表*/    char index[]="0123456789ABCDEF";    unsigned unum;/*中间变量*/    int i=0,j,k;    /*确定unum的值*/    if(radix==10&&num<0) { /*十进制负数*/        unum=(unsigned)-num;        str[i++]='-';    } else unum=(unsigned)num; /*其他情况*/    /*转换*/    do {        str[i++]=index[unum%(unsigned)radix];        unum/=radix;    } while(unum);    str[i]='\0';    /*逆序*/    if(str[0]=='-'){        k=1;/*十进制负数*/    }    else{        k=0;    }    char temp;    for(j=k; j<=(i-1)/2; j++) {        temp=str[j];        str[j]=str[i-1+k-j];        str[i-1+k-j]=temp;    }    return str;}

输出如下:

6 28 496[Finished in 1.9s]
  • 所以1-1000以内的所有完数为:6,28,496.

sublime 只适合装逼,不适合写代码…

0 0