如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如4/3,8/1,1/7, 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1和2020)?
运行限制
- 最大运行时间:2s
- 最大运行内存: 128M
分数的分子和分母的最大公约数是 1
-
通过这句话,我们可以联想到gcd函数
-
啥是gcd????
gcd是最大公约数
怎么找到gcd函数?
第一个系统自带有,查找gcd关键字就行
第二个,自己写一个
写gcd函数,需要用到 欧几里得原理,即我们的辗转相除法。
public int gcd(int a,int b){ if(b==0){ return a; } return gcd(b,a%b); }
这里是递归写法,也可以提一下递归
递归需要:
* 找重复
* 找变化 变化的量是参数
* 找边界 出口package 递归; public class test { public static void main(String[] args) { f(10); } static void f(int i) { // 出口 if(i==0) { return; } f(i-1); } /** * 找重复 n*(n-1)阶乘 * 找变化 变化的量是参数 * 找边界 出口 * @param i * @return */ static int f1(int n) { if(n==1) { return 1; } return n*f1(n-1); } //自己做一部分 static void f2(int m) { System.out.println(m); f2(m-1); } //倒序 static int fn(int[]arr,int length) { if(length==arr.length-1) { return arr[length]; } return fn(arr,length-1); } //fan转字符串 static String remove(String src,int end) { if(end==0) { return ""+src.charAt(0); } return ""+src.charAt(end)+remove(src,end-1); } //数组求和 //斐波拉 f(n)=f(n-1)+f(n-2) static int ff(int n) { if(n==1||n==2) { return 1; } return ff(n-1)+ff(n); } //辗转相除法,最大公约数 //m%n=0;n是公倍数 m,n--->n,m%n static int gcd(int m,int n) { if(n==0)return 0; return gcd(n,m%n); } //插入排序 0-倒数第二个排,插入最后一个 static void Sort(int[]arr,int k) { if(k==0) { return; } int x=arr[k]; int idx=k-1; Sort(arr,k-1); while(x<arr[idx]) { arr[idx-1]=arr[idx]; idx--; } arr[idx+1]=x; } /** * 递归 * 找重复,划分方法 * 找递归公式或等价转换 * 找变化量,作为参数 * 找出结束条件 */ //汉诺塔 //将1-N,移动到b c辅助 //等价为, 1 .。n-1移动到c a为源,b是辅助 // 把n 从a移动到b // 把1-n 从c移动到b,a是辅助 static void printHan(int N,String from,String to,String help) { if(N==1) { System.out.println("more"+N+"ffom"+from+"to"+to); return; }else { printHan(N-1 ,from,help,to);//1 .。n-1移动到辅助空间 System.out.println("more"+N+"ffom"+from+"to"+to); printHan(N-1,help,to,from);//从辅助空间回到源空间 } } }
代码里面有好几个题,可以参考理解一下
题解:
//求最大公约数-辗转相除法 // (16,12)-(12,16%12=4)-(4,12%4=0)- 余数为0则得最大公约数4 public static void main(String[] args) { // Scanner scan = new Scanner(System.in); //在此输入您的代码... // 1.最大公约数是 1 int num=0; for(int i=1;i<=2020;i++){ for(int j=1;j<=2020;j++){ // 如果一个分数的分子和分母的最大公约数是 1 if(gcd(i,j)==1){ num++; } } } System.out.println(num); // scan.close(); } public static int gcd(int a,int b){ if(b==0){ return a; } return gcd(b,a%b); } }