已知整数a、b、c。你的任务是求出区间[a,b]内的整数,满足该数与“该数的所有因数(不包括本身但包括1,1的因数和按0处理)相加之和”的差的绝对值小于等于c的数字。例如27的因数是1、3、9。那么27与27的所有因数和的差为:27-(1+3+9)=14。
输入格式:
只有一行,为三个用空格分隔的整数,依次代表a、b、c。a、b代表所求区间范围,满足1<=a<=b<=10000,c代表限制条件,c>=0且小于10。
输出格式:
若干个整数,即满足条件的全部整数,每五个数为一行,整数之间用tab分隔,最后一个数后为换行符。当该区间没有符合条件的整数时,输出“There is no proper number in the interval.”。
输入样例一:
1 10000 0
输出样例一:
6 28 496 8128
输入样例二:
900 1000 0
输出样例二:
There is no proper number in the interval.
坑点
寻找的范围:j>=a&&j<=b,j<=b容易丢
输出的格式:最好单独设置一个变量来控制输出,分情况讨论输出(我懒得修改了)
不要用abs绝对值函数,用数学方法表示绝对值的含义才行(否则只有80分)
j==1需要单独讨论
代码
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,j,k=0,sum;
int a,b,c,cnt=0;
int num[1000];
scanf("%d %d %d",&a,&b,&c);
for(j=a;j<=b;j++)//j<=b这里有一个考点
{
sum=0;//sum每一次都需要重置
if(j==1)
{
sum=0;
if(1<=c)
{
cnt++;
num[0]=1;
k=1;
}
}
else{
for(i=1;i<=j/2;i++)
{
if(j%i==0)//找因数之和
{
sum+=i;
}
}//printf("j=%d sum=%d\n",j,sum);
if(j==1)
{
sum=0;
}
if((j-sum)<=c&&(j-sum)>=-c)//考点
{
num[k++]=j;
cnt++;//记录符合条件的数字个数
}
}
}
if(cnt==0)
{
printf("There is no proper number in the interval.\n");
}
else if(cnt%5==0)
{
for(i=0;i<cnt;i++)
{
if((i+1)%5==0)
{
printf("%d\n",num[i]);
}
else printf("%d\t",num[i]);
}
}
else if(cnt%5!=0)
{
for(i=0;i<cnt;i++)
{
if(cnt>i+1)
{
if((i+1)%5==0)
{
printf("%d\n",num[i]);
}
else printf("%d\t",num[i]);
}
else printf("%d\n",num[i]);
}
}
return 0;
}