【题目】
题目详情
小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数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 * 题目: 素因子集合 * 来源:http://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; }
时间: 2024-09-27 18:45:50