一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如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 只适合装逼,不适合写代码…