版权声明:代码属于原创,转载请联系作者并注明出处。 https://blog.csdn.net/weixin_43379056/article/details/84937394
1040. 除法游戏
题目描述
小A和小B是一对好朋友,他们的爱好是研究数字。学过除法之后,他们就发明了一个新游戏:两人各说一个数字分别为a和b,如果a能包含b的所有质数因子,那么A就获胜。但是当数字太大的时候,两个朋友的脑算速度就有点跟不上了。
现在,请你写个程序,来判断胜负吧:输入两个正整数,表示a和b(2≤a, b≤10 18)。如果a包含了b的所有质数因子,则输出“Yes”,否则输出“No”(输出时没有引号)。
输入
输入两个正整数a和b,中间用一个空格隔开。
输出
如果a包含了b的所有质数因子,则输出“Yes”,否则输出“No”(输出时没有引号)。
样例输入
输入1:
120 75
输入2:
7 8
样例输出
输出1:
Yes
输出2:
No
数据范围限制
2≤a, b≤10 18
C++代码
#include <iostream>
#include <cmath>
#include <cassert>
#include <ctime>
using namespace std;
long long gcd(long long m, long long n)
{
return (n == 0) ? m : gcd(n, m % n);
}
bool checkPrime(long long n)
{
if ((n <= 1) || (n!=2 && n%2==0))
{
return false;
}
long long root = (long long)sqrt((long double)n);
for(long long i=3; i<=root; i+=2)
{
if (n%i == 0)
{
return false;
}
}
return true;
}
int main()
{
long long a, b;
bool b_has_a_allPrimeFactors;
cin >> a >> b;
if (a%b == 0) // b is one divisor/factor of a
{
b_has_a_allPrimeFactors = true;
}
else
{
if (1 == gcd(a, b)) // a and b are co-prime
{
b_has_a_allPrimeFactors = false;
}
else
{
b_has_a_allPrimeFactors = true;
for(long long i=2; i<=(long long)sqrt((long double)b); i++)
{
if (b%i == 0 && true == checkPrime(i) && a%i != 0)
{
b_has_a_allPrimeFactors = false;
break;
}
else if (b%i == 0 && true == checkPrime(b/i) && (a%(b/i) != 0))
{
b_has_a_allPrimeFactors = false;
break;
}
}
}
}
if (true == b_has_a_allPrimeFactors)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
return 0;
}
另一种求解方法
#include <iostream>
using namespace std;
class DivisionGame
{
private:
long long gcd(long long m, long long n);
public:
bool win(long long a, long long b);
};
long long DivisionGame::gcd(long long m, long long n)
{
return (n == 0) ? m : gcd(n, m % n);
}
bool DivisionGame::win(long long a, long long b)
{
long long c = gcd(a, b);
b = b / c;
if(c % b == 0)
{
return true;
}
return false;
}
int main()
{
long long a, b;
cin >> a >> b;
DivisionGame noi1040;
if (true == noi1040.win(a, b))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
return 0;
}