问题 A: 完数
http://codeup.cn/problem.php?cid=100000592&pid=0
#include<cstdio>
#include<cmath>
int main(void)
{
int n;
int i,j;
while( scanf("%d",&n) != EOF )
{
if(n<6)
continue;
else
{
printf("6 ");
for(i=7;i<=n;i++)
{
int sum=1;
int sql=(int)sqrt(i*1.0);
for(j=2;j<=sql;j++)
{
if(i%j==0)
{
sum=sum+j+i/j;
}
}
if(sql*sql==i)// 36这种类似的情况
{
sum=sum-sql;
}
if(sum==i)
printf("%d ",i);
}
printf("\n");
}
}
return 0;
}
问题 C: 质因数的个数
http://codeup.cn/problem.php?cid=100000592&pid=2
题目中给的最大数并不是特别大。所以打印出前100多中的质数表就足以。
#include<cstdio>
#include<cmath>
int a[50]={
2};
int main(void)
{
int i,j,n;
int k=1;
for(i=3;i<=120;i++)
{
for(j=2;j<=(int)sqrt(1.0*i);j++)
{
if(i%j==0)
break;
}
if(j>(int)sqrt(1.0*i))
{
a[k++]=i;
}
}
while( scanf("%d",&n) != EOF )
{
int count=0;
for(i=0;i<k;i++)
{
while(n%a[i]==0)
{
n=n/a[i];
count++;
}
}
if(n!=1)
{
count++;
}
printf("%d\n",count);
}
return 0;
}
问题 D: 约数的个数
http://codeup.cn/problem.php?cid=100000592&pid=3
#include<cstdio>
#include<cmath>
int main(void)
{
int n;
int number;
int i,j,count;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
{
scanf("%d",&number);
count=0;
int sql=(int)sqrt(1.0*number);
for(j=1;j<=sql;j++)
{
if(number%j==0)
{
count++;
count++;
}
}
if(sql*sql==number)
count--;
printf("%d\n",count);
}
}
return 0;
}
精简版:
#include <cstdio>
#include <cmath>
int main() {
int n;
while (scanf("%d", &n), n) {
for (int i = 0; i < n; i++) {
int t, cnt = 0;
scanf("%d", &t);
int sqr = (int)sqrt(1.0 * t);
for (int i = 1; i <= sqr; i++) {
if (t % i == 0) cnt += 2; //如1和t本身, 一次性算2个
if (i * i == t) cnt--; //如36, 作为约数集合的对称轴6只算一次
}
printf("%d\n", cnt);
}
}
return 0;
}
问题 E: 完数与盈数
http://codeup.cn/problem.php?cid=100000592&pid=4
#include<cstdio>
#include<cmath>
int main(void)
{
int n;
int i,j;
int sum;
int a[50]={
0};
int b[50]={
0};
a[0]=6;
int a_index=1;
int b_index=0;
for(i=7;i<=60;i++)
{
sum=1;
int sql=(int)sqrt(i*1.0);
for(j=2;j<=sql;j++)
{
if(i%j==0)
{
sum=sum+j+i/j;
}
}
if( sqrt(i)*sqrt(i) == i )// 36这种类似的情况
{
sum=sum-sql;
}
if(sum==i)
a[a_index++]=i;
if(sum>i)
{
b[b_index++]=i;
}
}
printf("E: ");
for(i=0;i<a_index-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[a_index-1]);
printf("G: ");
for(i=0;i<b_index-1;i++)
{
printf("%d ",b[i]);
}
printf("%d\n",b[b_index-1]);
return 0;
}