问题 A: 完数
题目描述
求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。
输入
测试数据有多组,输入n,n数据范围不大。
输出
对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
样例输入 Copy
6
样例输出 Copy
6
思路
一开始想复杂了,数据没给那么大,暴力即可,注意换行
/*#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int prime[maxn],pnum=0;
bool p[maxn]={0};
void findprime(){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pnum++]=i;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
}
struct factor{
int x,cnt;
};
int main()
{
int n,num=0;
scanf("%d",&n);
findprime();
/*printf("%d=",n);
int sqr=(int)sqrt(1.0*n);
for(int i=0;i<pnum&&prime[i]<=sqr;i++)
{
if(n%prime[i]==0){
fac[num].x=prime[i];
fac[num].cnt=0;
while(n%prime[i]==0){
fac[num].cnt++;
n=n/prime[i];
}
num++;
}
if(n==1)break;
}
if(n!=1){
fac[num].x=n;
fac[num++].cnt=1;
}
for(int i=0;i<num;i++)
{
if(i>0)printf("*");
printf("%d",fac[i].x);
if(fac[i].cnt>1){
printf("^%d",fac[i].cnt);
}
}
for(int i=6;i<=n;i++)
{
factor fac[10];
int sqr=(int)sqrt(1.0*i);
for(int j=0;j<pnum&&prime[j]<=sqr;j++)
{
if(i%prime[j]==0){
fac[num].x=prime[j];
num++;
}
if(i==1)break;
}
if(i!=1){
fac[num].x=n;
fac[num++].cnt=1;
}
int sum=0;
for(int k=0;k<10;k++)
{
sum=sum+fac[k].x;
}
// if(sum==i){
printf("%d ",i);
// }
}
return 0;
} */
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int prime[maxn],pnum=0;
bool p[maxn]={0};
void findprime(){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pnum++]=i;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
}
int main()
{
findprime();
long long int n;
while(scanf("%lld",&n)!=EOF)
{
long long int num=0;
long long int a[10]={0};
for(long long int i=6;i<=n;i++)
{
//if()
long long int sum=i;
for(long long int j=1;j<i;j++)
{
if(i%j==0)
{
sum=sum-j;
if(sum<0)
{
break;
}
}
}
if(sum==0)
{
a[num++]=i;
}
}
for(long long int i=0;i<num;i++)
{
printf("%lld",a[i]);
if(i!=num-1)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
B题与A题重复,不再叙述
问题 C: 质因数的个数
题目描述
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=22235,共有5个质因数。
输入
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出
对于每组数据,输出N的质因数的个数。
样例输入 Copy
120
200
样例输出 Copy
5
5
提示
注意1不是N的质因数;若N为质数,N是N的质因数。
###思路
素数打表,求质因数
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int prime [maxn],pnum=0;
bool p[maxn]={0};
void findprime(){
for(int i=2;i<maxn;i++)
{
if(p[i]==false){
prime[pnum++]=i;
for(int j=i+i;j<maxn;j+=i)
{
p[j]=true;
}
}
}
}
struct factor{
int x=0;
int cnt=0;
};
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
findprime();
int num=0,sum=0;
factor fac[10];
int sqr=(int)sqrt(n*1.0);
for(int i=0;i<pnum&&prime[i]<=sqr;i++)
{
if(n%prime[i]==0)
{
fac[num].x=prime[i];
while(n%prime[i]==0)
{
fac[num].cnt++;
n=n/prime[i];
}
num++;
}
if(n==1)break;
}
if(n!=1){
fac[num].x=n;
fac[num++].cnt=1;
}
for(int i=0;i<10;i++)
{
sum+=fac[i].cnt;
//printf("%d %d\n",fac[i].x,fac[i].cnt);
//printf("%d\n",prime[i]);
}
printf("%d\n",sum);
}
return 0;
}
问题 D: 约数的个数
时间限制 : 1.000 sec 内存限制 : 32 MB
题目描述
输入n个整数,依次输出每个数的约数的个数。
输入
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入 Copy
6
1 4 6 8 10 12
0
样例输出 Copy
1
3
4
4
4
6
思路
水题,花了点时间,此题不要求算出具体的值,只要求个数,一个约数对应另一个约数+2即可,只需要加个sqrt即可,否则超时
#include<bits/stdc++.h>
using namespace std;
int num;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
return 0;
}
for(int i=0;i<n;i++)
{
num=0;
int sum=2;
scanf("%d",&num);
if(num==1)
{
printf("1\n");
continue;
}
int sqr=(int)sqrt(num*1.0);
int a=num;
for(int j=2;j<=sqr;j++)
{
if(num%j==0)
{
sum+=2;
if(j*j==num)
{
sum--;
}
}
}
printf("%d\n",sum);
}
}
return 0;
}
问题 E: 完数与盈数
题目描述
一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1,则称其为“完数”;
若因子之和大于该数,则称其为“盈数”。求出2 到60 之间所有“完数”和“盈数”,并以如
下形式输出: E: e1 e2 e3 …(ei 为完数) G: g1 g2 g3 …(gi 为盈数)
输入
无
输出
按描述要求输出(注意EG后面的冒号之后有一个空格)。
思路
模拟就好了,注意去重,还有只需要到sqrt即可。
#include<bits/stdc++.h>
using namespace std;
int E[60],G[60];
int num1=0,num2=0;
int main()
{
for(int i=2;i<=60;i++)
{
int sum=1;
int sqr=(int)sqrt(i*1.0);
for(int j=2;j<=sqr;j++)
{
if(i%j==0&&j*j!=i)
{
sum=sum+j+(i/j);
}
}
if(sum==i)
{
E[num1++]=i;
}
if(sum>i)
{
G[num2++]=i;
}
//printf("i=%d sum=%d\n",i,sum);
}
printf("E: ");
for(int i=0;i<num1;i++)
{
printf("%d ",E[i]);
}
printf("G: ");
for(int i=0;i<num2;i++)
{
printf("%d ",G[i]);
}
return 0;
}