习题6-3 使用函数输出指定范围内的完数
程序员文章站
2022-06-07 14:38:59
...
前言
这个题目有点麻烦,判断是否为完数的函数,很快就把程序写下来了,但是对于输出那种格式我想了好一会儿。最后写出来代码有点长(嵌套多不易读)还是技术不行啊,结果都能输出但是PTA的编译器还是报错,做个参考,不知道原因。。。
正文
代码一(无法通过)
想看正确答案,请直接跳过至代码二。
#include <stdio.h>
int factorsum( int number );
void PrintPN( int m, int n );
int main()
{
int i, m, n;
scanf("%d %d", &m, &n);
if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
PrintPN(m, n);
return 0;
}
/* 你的代码将被嵌在这里 */
int factorsum( int number )
{
int i,j,mul,f,s[1000];
int sum=0;
f=0;
for(i=1;i<=number;i++){
for(j=1;j<=number;j++){
mul=i*j;//循环相乘
if(number==1)
s[f++]=i;
else if(number==mul&&i!=number)
s[f++]=i;
}
}
s[f]='\0';
for(f=0;s[f]!='\0';f++){
sum=sum+s[f];
}
return sum;
}
void PrintPN( int m, int n )
{
int i,j;//两个因子
int mul,f,count;
count =0;
int s[1000];//用于存储因子
for(;m<=n;m++){
f=0;
if(factorsum(m)==m){
count++;//记录完数个数
for(i=1;i<=m;i++){
for(j=1;j<=m;j++){
mul=i*j;//循环相乘
if(m==1)//特殊情况,输入的是1
s[f++]=i;
else if(m==mul&&i!=m)
s[f++]=i;
}
s[f]='\0';
}
printf("%d = ",m);
for(f=0;s[f]!='\0';f++){
printf("%d ",s[f]);
if(s[f+1]!='\0')//最后一个不要加号
printf("+ ");
s[f]=0;
}
putchar('\n');
}
}
if(!count) printf("No perfect number");
}
代码二
int factorsum(int number) { //判断number是否为完数
int i, sum = 0;
if (number == 1) return 1;
for (i = 1; i < number; i++) {//不包含自身不能用<=
if (number % i == 0) {
sum = sum + i;
}
}
return sum;
}
void PrintPN(int m, int n) {
int i, j, count = 0;
for (i = m; i <= n; i++) {
if (factorsum(i) == i) {
count++; // count用来计数,表示完数的个数
printf("%d = ", i);
if (i == 1) printf("1");//特殊情况1
for (j = 1; j < i; j++) {
if (i % j == 0) //判断是不是因子
{
printf("%d", j);
if (j == i / 2) //判断加到最后一位数时,无加号
break;
printf(" + ");
}
}
printf("\n");
}
}
if (!count) printf("No perfect number");
}
上一篇: 拍泡沫之夏 笑话
下一篇: 严蔚敏数据结构源码及习题解析