5.5 质因子分解练习

codeup 质因子分解

题号:10000592

A题 :完数

题目链接:http://codeup.cn/problem.php?cid=100000592&pid=0

#include <iostream>
using namespace std;
int wan(int n){
	int sum=0,i;
	for(i=1;i<n;i++){
		if(n%i==0){//查找质因子 
			sum+=i;
		}
	}
	if(sum==i){//如果质因子之和等于n,就是完数 
		return sum;
	}else{
		return 0;
	}
}
int main(){
	int n;
	while(cin>>n){
		int i;
		for(i=1;i<=n;i++){
			if(wan(i))
			cout<<i<<endl;
		}
	}
	return 0;
}

B题 :完数(同A)

题目链接:http://codeup.cn/problem.php?cid=100000592&pid=1

C题 :质因数的个数

题目链接:http://codeup.cn/problem.php?cid=100000592&pid=2

#include <iostream>
#include <cmath>
using namespace std;
const int maxn=1000010;
int prime[maxn],pNum=0;
bool p[maxn]={0};
void find_prime(int n){
	int sqr=(int)sqrt(1.0*n);
	for(int i=2;i<=sqr;i++){
		if(p[i]==false){
			prime[pNum++]=i;
			for(int j=i+i;j<=sqr;j+=i){
				p[j]=true;
			}
		}
	}
} 
int main(){
	int number;//测试的数据
	while(cin>>number){
		int count=0;// 质因子的个数 
		find_prime(number);
		for(int i=0;i<pNum;i++){
			while(number%prime[i]==0){
				number/=prime[i];
				count++;
			}
		}
		if(number>1) count++;
	    cout<<count<<endl;
	}
	return 0;
} 

D题 :约数的个数

题目链接:http://codeup.cn/problem.php?cid=100000592&pid=3

#include<cstdio>
#include<cmath>

int main() {
	int n, a, count;
	while(scanf("%d", &n) != EOF) {
		if(n == 0)
			break;
		for(int i = 0; i < n; i++) {
			scanf("%d", &a);
			if(a == 1)
				printf("1\n");
			else{
				count = 0;
				double sqr = sqrt(1.0 * a);
				for(int j = 2; j <= sqr; j++)		
					if(a % j == 0)
						count = count + ((j < sqr) ? 2 : 1);//如果在1到根号n之间,就是2,如果大于根号n,就加一
			}
		}
	}
	return 0;
}

E题 :完数与盈数

题目链接:http://codeup.cn/problem.php?cid=100000592&pid=4

#include <iostream>
using namespace std;
int wan(int n){
	int sum=0,i;
	for(i=1;i<n;i++){
		if(n%i==0){//查找质因子 
			sum+=i;
		}
	}
	if(sum==i){//如果质因子之和等于n,就是完数 
		return 1;
	}else if(sum>i){
		return 2;
	}else{
		return 0;
	}
}
int main(){
	int E[60];
	int G[60];
		int x=0,y=0;
		int i;
		for(i=2;i<=60;i++){
			if(wan(i)==1){
				E[x]=i;
				x++;
			}else if(wan(i)==2){
				G[y]=i;
				y++;
			}
		}
		cout<<"E: ";
		for(int i=0;i<x;i++){
			cout<<E[i];
			if(i==x-1) cout<<endl;
			else cout<<" "; 
		}
		cout<<"G: ";
		for(int i=0;i<y;i++){
			cout<<G[i];
			if(i==y-1) cout<<endl;
			else cout<<" "; 
		}
	
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值