xdoj做题日志

完数寻找

要求

请写一个程序,给出指定整数范围[a,b]内的所有完数,0 < a < b < 10000。
一个数如果恰好等于除它本身外的所有因子之和,这个数就称为"完数"。
例如6是完数,因为6=1+2+3

输入说明    
输入为两个整数a和b,a和b之间用空格分隔

输出说明    
输出[a,b]内的所有完数,每个数字占一行

输入样例    
1 10

输出样例    
6

int per_num(int x)
{
  if(x==1)
  return 0;//单独讨论1
  else
  {
  int data[10000];//数组不允许一个变化的大小
  int count=0;
  int sum=0;
    for(int j=0;j<x;j++)
  {
    data[j]=0;//将前x项数初始化为0
  }
  for(int i=1;i<x;i++)
  {
    if(x%i==0)//进行约数的判断
    {
      data[count]=i;
      count++;//将约数赋给数组data
    }
  }
  for(int j=0;j<x;j++)
  {
    sum=data[j]+sum;//将数组中的前x项相加
  }
  if(sum==x)
  return x;//若是合数,返回本身
  else
  return 0;
  }
}
int main()
{
  int a,b;
  int count1=0;
  int j=0;
  scanf("%d %d",&a,&b);
  if(0<a&&a<b&&b<10000)
  {
    for(int i=a;i<=b;i++)
    {
      if(per_num(i)==i)
      count1++;//记录出现的合数的数量
    }
    int num[10000];//存储合数的数组
    for(int i=a;i<=b;i++)
    {
      if(per_num(i)==i)
      {
      num[j]=i;//将合数赋值给num
      j++;
      }
    }
    for(int j=0;j<count1;j++)//count1所记录下的合数的数目决定了循环的次数,注意count不取等号
    {
       printf("%d",num[j]);
       printf("\n");//逐行打印
    }
  }
  return(0);
}//不难发现数组data与num中的垃圾值对结果没有影响,因为通过计数器我们控制了数组赋值与数组打印的次数,从而防止了数组中垃圾值的影响

 思路:1:创建一个函数用于判断是否为合数,若为合数返回本身,否则返回0,这个函数完成两个功能,存储约数并且将约数相加

2:主体部分第一个循环判断合数的数量,第二个循环检索合数并将其存在数组中

3:最后用count变量记录下的合数数目作为最后一次循环循环的次数,并将合数逐行打印

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值