这节课课后题有点多,我们慢慢来搞定
项目一
1.代码:
<pre name="code" class="cpp">/*完数-1
输入一个数n,判断n是否是完数*/
#include <stdio.h>
#include <math.h>
int main()
{
int i,sum=1,s,b;
double k;
char c;
do
{
rewind(stdin);//重置缓冲区,以免输入字符等数据时对s的错误赋值
b=scanf("%d",&s);
if((b==0&&((c=getchar())<48))||((c=getchar())>57))//判断输入的数是否有特殊字符和字母,这里全角的符号暂时无解,我不知道计算机怎么存储的。
{
printf("请重新输入一个数\n");
continue;
}
else
{
k=sqrt(s);
sum=1;
for(i=2;i<=k;++i)
{
if(s%i==0)
sum+=i+s/i;
}
if(sum==s&&sum!=1)//注意,1没有真因子,所以1不是完数,排除掉
{
printf("该数为完数\n");
printf("1");
for(i=2;i<s;i++)
{
if(s%i==0)
printf("+%d",i);
}
}
else
printf("该数不是完数\n");
}
}while(1);
return 0;
}
代码有点乱,因为我写的代码都是先写核心,在慢慢补充功能,所以就成这样了!
2.代码:
/*完数-2
输出1000以内所有的完数*/
#include <stdio.h>
#include <math.h>
int main()
{
int s,i,sum=1;
double k;
for(s=1;s<=1000;s++)
{
k=sqrt(s);
sum=1;
for(i=2;i<=k;i++)
{
if(s%i==0)
sum+=i+s/i;
}
if(sum==s&&sum!=1)
printf("%d ",s);
}
return 0;
}
这题要注意,每次循环完sum的值一定要注意重置!
3.代码:
#include <stdio.h>
int main()
{
int i,k,suma,sumb;
for(i=1;i<=300000;i++)
{
suma=0;
for(k=i/2;k>0;k--)
{
if(i%k==0)
suma+=k;
}
sumb=0;
for(k=suma/2;k>0;k--)
{
if(suma%k==0)
sumb+=k;
}
if(sumb==i&&sumb!=suma&&suma>i&&suma<=300000)
{
printf("i=%d,其亲密数为:%d\n",i,suma);
}
}
return 0;
}
今天只做了一题,一直在想怎么才能输出每个因子相加的过程,事实证明实在是麻烦,重写一遍计算suma和sumb 实在没必要,浪费了一晚上,以后学到好办法在来搞定