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

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

项目一

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值