6-7 实验5_11_设计函数isPerfect与printPerfect
分数 100
如果一个整数的各因子(包括1但不包括该整数本身)值之和等于该整数,则该整数称为“完全数”(perfect number)。例如,6是一个完全数,因为6=1+2+3。你的任务是设计函数isPerfect和printPerfect,判断并打印出区间[a,b](1<=a
isPerfect函数原型:int isPerfect(int n);
用于判断正整数n是否为完全数,若是,则返回值为1,否则为0。
printPerfect函数原型:void printPerfect(int n);
用于打印出一个完全数n的所有因子,当执行printPerfect(6)时,打印效果为:6=1+2+3。
输入与输出要求:
输入两个正整数a和b,输出区间[a,b]内的所有完全数及完全数的总个数
裁判测试程序样例
函数被调用的例子如下:
#include
//判断一个数是否为完全数的函数
int isPerfect(int);
//打印完全数的函数
void printPerfect(int);
int main()
{
int i,a,b,count;
scanf("%d%d",&a,&b);
count = 0 ;//a,b两数间完全数的数量,初始化为0
for(i=a;i<=b;i++)
{
if (isPerfect(i)) //如果是完全数
{
printPerfect(i) ;//打印该完全数
count ++ ; //计数器加1
}
}
printf("The total number is %d.\n",count);//输出a,b两数间完全数的数量
return 0 ;
}
**下面是我的程序**
int isPerfect(int n)
{ int i,a,sum;
sum=0;
for(i=1;i//i
{
a=n%i;
if(a==0)sum+=i; // sum+=a;
}
if (sum==n) return 1;
else
return 0;
}
void printPerfect(int n)
{ printf("%d=1",n);
int i,a,sum;
for(i=2;iif(a==0)
{ printf("+%d",i); }
}
printf("\n");
}
int isPerfect(int n)
{
int sum = 0;
for(int i=1;i*i<=n;i++)
if(n%i==0)
{
sum += i;
if(i*i != n)
sum += n/i;
}
if(sum == n)
return 1;
return 0;
}
void printPerfect(int n)
{
printf("1");
for(int i=2;i<=n/2;i++)
{
if(n%i==0)
printf("+%d",i);
}
}
你的两个函数重复进行遍历,相当于花了2倍的时间,代码修改如下:
#define _CRT_SECURE_NO_WARNINGS 1
//函数被调用的例子如下:
#include <stdio.h>
#include <math.h>
//判断一个数是否为完全数的函数
int isPerfect(int);
//打印完全数的函数
void printPerfect(int);
int g_a[10000], g_b[10000];
int g_nmb = 0;
int main()
{
int i, a, b, count;
scanf("%d%d", &a, &b);
count = 0;//a,b两数间完全数的数量,初始化为0
for (i = a; i <= b; i++)
{
if (isPerfect(i)) //如果是完全数
{
printPerfect(i);//打印该完全数
count++; //计数器加1
}
}
printf("The total number is %d.\n", count);//输出a,b两数间完全数的数量
return 0;
}
/**下面是我的程序**/
int isPerfect(int n)
{
int i, sum, end;
end = sqrt(n);
sum = 1;
g_nmb = 0;
for (i = 2; i <= end; i++)//i<n
{
if (n % i == 0)
{
g_a[g_nmb] = i;
g_b[g_nmb] = n / i;
sum += g_a[g_nmb] + g_b[g_nmb];
g_nmb++;
}
}
if (sum == n) return 1;
else
return 0;
}
void printPerfect(int n)
{
printf("%d=1", n);
for (int i = 0; i < g_nmb; i++)
{
printf("+%d", g_a[i]);
}
for (int i = g_nmb - 1; i >= 0; i--)
printf("+%d", g_b[i]);
printf("\n");
}