题意:
判断一个分数在某一进制下是否为无限小数。
思路:
首先把这个分数约分,然后便是判断。
首先,一个分数是否为无限小数,与分子是无关的,只与分母有关。
然后,再来看看10进制的分数,可化为有限小数的特点,10为分母可以,2为分母可以,16为分母可以,40为分母可以。。。。
总之,其实全部都与2和5有关,2和5又是10的质因数,所以可以猜想到,如果分母可以分解为进制的质因子的乘积,那么就可以化为有限小数。
所以,就判断q的质因子是否为b的子集。
每次求出q与b的最大公约数g,那么g必须可以全部包含q的质因子,所以q /= g,b = g,然后一直这样做,直到g为1,最后再判断q能否整除b。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 typedef long long ll; 6 ll gcd(ll a,ll b) 7 { 8 if (b == 0) return a; 9 else return gcd(b,a%b); 10 } 11 int main() 12 { 13 int n; 14 scanf("%d",&n); 15 ll p,q,b; 16 while (n--) 17 { 18 scanf("%lld%lld%lld",&p,&q,&b); 19 ll t = gcd(p,q); 20 p /= t; 21 q /= t; 22 if (p == 0) puts("Finite"); 23 else 24 { 25 while (b % q) 26 { 27 ll g = gcd(b,q); 28 if (g == 1) break; 29 b = g; 30 q /= g; 31 } 32 if (b % q == 0) puts("Finite"); 33 else puts("Infinite"); 34 } 35 } 36 return 0; 37 }