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

一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值