`
SunnyYoona
  • 浏览: 366869 次
社区版块
存档分类
最新评论

庞果网之素因子集合

 
阅读更多

【题目】

题目详情

小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics