更多JAVA版答案移步我的博客:蓝桥杯JAVA版答案汇总
本题考查
辗除法,本题暴力求解不会超时
思路
重点说一下辗除法:
很多参考资料都强调两个参数相对大小情况,其实并不需要考虑它们的相对大小,例如getGCD(3,9)
与getGCD(9,3)
,getGCD(3,9)
经过一次迭代后就会变成getGCD(9,3)
,所以并不需要编写代码判断相对大小。辗除法资料
flag
表示对应数量的包子数是否能取到
- 当读取到第二个数的时候,计算这两个数的最大公因数,读取第三数及以后时,计算之前的最大公因数与当前数字的最大公因数
- 若最大公因数为1,则肯定不是INF,转到3;否则输出INF,转到4
- 从最小包子数开始,设
i
为当前包子数对每个小于i
的包子数j
进行判断,如果包子数i
与包子数j
都能取到,则将flag[i+j]
设为true
- 程序结束
AC代码
import java.util.Scanner;
public class Main {
static int getGCD(int m, int n) {
return n==0? m:getGCD(n, m % n);
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
boolean[] flag = new boolean[10000];
int min,GCD; GCD=0; min=500;
int round = scaner.nextInt();
int[] arr = new int[round];
for (int i = 0; i < round; i++) {
int temp = scaner.nextInt();
if(i==1) GCD=getGCD(arr[0], temp);
else GCD=getGCD(GCD, temp);
if(temp<min) min=temp;
arr[i]=temp;
flag[temp]=true;
}
scaner.close();
if(GCD!=1) System.out.println("INF");
else {
int sum=0;
for(int i=min;i<10000;i++)
for(int j=1;i+j<10000;j++)
if(flag[j]&&flag[i]) flag[i+j]=true;
for(int i=1;i<10000;i++)
if(!flag[i]) sum++;
System.out.println(sum);
}
}
}