完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。
本题的任务是判断两个正整数之间完数的个数。
输入
输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<=10000) 。
输出
对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完数个数。
样例输入 Copy
2
2 5
5 7
样例输出 Copy
0
1
提示
1 < num1 <= num2 <= 10000
我的代码
#include
using namespace std;
int main()
{
int n;
cin>>n;
int a[n][2];
for(int i = 0;i<n;i++)
for(int j=0;j<2;j++)
cin>>a[i][j];
for(int k =0;k<n;k++)
{
int s=0;
for(int l=a[k][1];l<a[k][2];l++)
{
int sum=0;
for(int j=1;j<l/2;j++){
if(l%j==0)
sum+=j;
if(sum==l)
s+=1; }
}cout<<s<<endl;
}
return 0;
}
1是C语言不支持用变量定义数组大小
2是for(int l=a[k][1];l<a[k][2];l++)这里数组越界了,数组下标从0开始,应该是for(int l=a[k][0];l<a[k][1];l++)
3. if(sum==l) s+=1; 需要放在if语句的外面。
代码修改如下:
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int** a;//[n][2];
a = new int*[n];
for(int i = 0;i<n;i++)
{
a[i] = new int[2];
for(int j=0;j<2;j++)
cin>>a[i][j];
}
for(int k =0;k<n;k++)
{
int s=0;
for(int l=a[k][0];l<a[k][1];l++)
{
int sum=0;
for(int j=1;j<l/2;j++)
{
if(l%j==0)
sum+=j;
}
if(sum==l)
s+=1;
}
cout<<s<<endl;
}
//释放空间
for(int i = 0;i<n;i++)
{
delete[] a[i];a[i] =0;
}
delete[] a;
a=0;
return 0;
}
for(int k =0;k<n;k++)
{
int s=0;
for(int l=a[k][1];l<=a[k][2];l++)
{
int sum=0;
for(int j=1;j<l;j++)
{
if(l%j==0)
sum+=j;
}
if(sum==l)
s+=1;
}
cout<<s<<endl;
}