庞果网之素因子集合
【题目】
题目详情
小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数A,B(0<A,B<2^60),判断他们的素因子集合是否相同,小强刚接触数论,想了好一会还是没能想出来,你能帮助他吗?
输入描述:
输入包含多组测试数据,每组测试数据包含两个正整数A,B,以文件结束。
输出描述:
对于每组测试数据如果A和B的素因子集合相同则输出“YES”,否则输出“NO”。
答题说明
输入样例:
2 8
4 9
10 50
输出样例:
YES
NO
YES
【分析】
唯一质因子分解定理:任意一个合数a仅能以一种方式,写成如下的乘积形式:
a = p1^e1*p2^e2*...*pr^er
其中pi为素数,p1<p2<...<pr,且ei为正整数。例如数6000=2^4*3*5^3。
【代码】
/*********************************
* 日期:2014-04-29
* 作者:SJF0115
* 题目: 素因子集合
* 来源:https://hero.csdn.net/Question/Details?ID=506&ExamID=501&from=211
* 结果:AC
* 来源:庞果网
* 总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 1000000
long long set[N],set2[N];
//素因子集合
int PrimeSet(long long n,long long *set){
int num = 0;
for(long long i = 2;i*i <= n;i++){
if(n % i == 0){
set[num++] = i;
while(n % i ==0){
n = n / i;
}
}//if
}//for
if(n > 1){
set[num++] = n;
}
//返回素数集合的个数
return num;
}
int main(){
int i;
long long a,b;
while(scanf("%lld%lld",&a,&b) != EOF){
memset(set,0,sizeof(set));
memset(set2,0,sizeof(set2));
int num = PrimeSet(a,set);
int num2 = PrimeSet(b,set2);
if(num != num2){
printf("NO\n");
}
else{
for(i = 0;i < num;i++){
if(set[i] != set2[i]){
printf("NO\n");
break;
}
}//for
if(i >= num){
printf("YES\n");
}//if
}//if
}//while
return 0;
}
最后更新:2017-04-03 12:56:29
上一篇:
设计模式六大原则——单一职责原则(SRP)
下一篇:
JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari……
Java中如何避免空指针异常
在Ubuntu 10.10下安装JDK配置Eclipse及Tomcat【转载 + 订正】
捡到iPhone7怎么解锁?iPhone已停用,苹果6s忘记解锁密码怎么办?
userdata for ECS 安全篇
专访 | 今日头条李磊:程序员如何跻身AI大潮,应用如何落地
阿里云推出VPN网关 混合云网络成本暴降85%
对于PowerDesigner中设计表自动生成Sql的分析
Facebook、中国BAT均落选,高盛全球“漂亮50”有哪些潜力股?
火车票网上售票,我们来说几句
maven编译时出现读取XXX时出错invalid LOC header (bad signature)