39节 问题求解——求素数 课后

来源:互联网 发布:linux系统制作iso镜像 编辑:程序博客网 时间:2024/06/05 06:55

这节课课后题有点多,我们慢慢来搞定

项目一

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  实在没必要,浪费了一晚上,以后学到好办法在来搞定


0 0
原创粉丝点击