(一)练习
1.题目描述
2.思路
欧几里得算法
gcd(int a,int b)
{
while(b!=0)//当分母不为0
{
//求余数要先写。
int tmp=a%b;(余数)
a=b;(a移动到b的位置上)
b=tmp;(b就是求出来的余数)
}
return a;//最后返回a
}
举一个例子
12和5的最大公约数是1
(1)tmp=12%5=2;
a=5,b=2
(2)因为b!=0,
tmp=5%2=1;
a=2
b=1
(3)因为b!=0,
tmp=2%1=0
a=1;
b=0;退出循环
此时公约数就是a=1
3.代码实现
import java.util.Arrays;
public class solution4 {
public int findGCD(int[] nums) {
Arrays.sort(nums);//升序排序
int min=nums[0];
int max=nums[nums.length-1];
int res=gcd(min,max);
return res;
}
public static int gcd(int a,int b)
{
while(b!=0)
{
int tmp=a%b;
a=b;
b=tmp;
}
return a;
}
public static void main(String[] args)
{
solution4 test=new solution4();
int[] nums={2,5,6,9,10};
System.out.println(test.findGCD(nums));
}
}
(二)实战(M)
有理数p/q在k进制是否是有限小数。
1/2=0.5是有限小数,1/2=0.3333…不是有限小数。
输入:第一行是整数t,代表测试数据的组数
接下来t行,输入三个整数,p(分子),q是(分母),k(进制基数)。
如果p/q在k进制数有限小数,输出“yes”,否则输出“no”
Input:
3
1 2 10
1 3 10
3 4 2
output:
yes
no
yes
思路:判断是否是有限小数
p=1,q=3,k=10
//求p和q的最大公约数
long res=gcd(p,q);//res=gcd=1;
q=q/res;//q=3/1=3;
g=gcd(q,k)=1,break
import java.util.Scanner;
public class solution3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for (int i = 0; i < t; i++) {
long p = sc.nextLong();
long q = sc.nextLong();
long k = sc.nextLong();
System.out.println(Pri(p, q, k));
}
sc.close();
}
// 判断是否是有限小数
public static String Pri(long p,long q,long k)
{
//把分数化成最简分数,去掉 p 和 q 的最大公因子。这样剩下的 q 才是真正要判断的分母。
long res=gcd(p,q);
q=q/res;
while(true)
{ long g = gcd(q, k);
if (g == 1) break;
q /= g; // 继续用 k 的质因子约掉 q
}
//return (q==1)?"yes":"no";
if(q==1)
{
return "yes";
}else
{
return "no";
}
}
public static long gcd(long p,long q)
{
while(q!=0)
{
long tmp=p%q;
p=q;
q=tmp;
}
return p;
}
}