目录
一、天干地支
解析:
可以简单爆算,毕竟给的值为1-9999,数值不大;
还有一种就是 计算连个年份的时间差后,分别模10和模12,当然要注意这个年份比当前年份小的情况,具体代码如下:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String []arr={"geng","xin","ren","gui","jia","yi","bing","ding","wu","ji"};
String []brr={"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
int a=0;//记录天干
int b=0;//记录地支
int n=scan.nextInt();
a=Math.abs(n-2020)%10;
b=Math.abs(n-2020)%12;
if(n>=2020){
System.out.println(arr[a]+brr[b]);
}else{
System.out.println(arr[(10-a)%10]+brr[(12-b)%12]);
}
scan.close();
}
}
二、包子凑数
解析:
这题和前面的一题:买不到的数 非常相像
通过买不到的数我们知道:两个互质数买不到的最大值为 a*b-a-b;
而包子凑数不过是把原定给的2种变成了1-100种,并且多了一个无解情况;
我们怎们去求哪些数买不到?那这个值可能无穷大,我们无法对它进行判定,但是我们可以去寻找可以买到的值,那么怎么判定?
1.通过买不到的数的结论 互质的两数 a*b-a-b是最大的买不到的数,那么我们只需要去判断这存在着的所有数种,是否有两个数是互质数,如果有,那么,a*b-a-b之后的所有数都可以获得,而其他数我们再进行判断;
2.存在互质数的情况下,它可能不只是一组,比如 3 6 10 11;
3和10互质,3和11互质,10和11互质 ;那么我们取哪一个?我们取结果最小的一个,这样可以让后面的运算更少,所以选择3*10;
3.判断完了买不到的最大值后,我们就可以用完全背包的方式,把所有可以获得的值获得,方法类似于去年的砝码称重,每次选择一种包子,看放入它后能填满哪些位置;
假设 3 7;买不到的最大值为3*7-10=11;
放入3,可以填满3 6 9;放入7,填满 7 10;所以1-11可以填满的位置为3 6 7 9 10,剩下的位置则为买不到的值;
4.如果存在1,则说明所有数都可以获得,那么就输出0;
具体代码如下:
import java.io.*;
import java.util.Arrays;
public class 包子凑数 {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st=new StreamTokenizer(br);
public static void main(String[] args) throws Exception {
int n = nextInt();
int[] arr = new int[101];
Arrays.fill(arr, 999);
int t, s = 0;//s用来求取有多少种不同的蒸笼
for (int i = 0; i < n; i++) {
t = nextInt();
if (arr[t] == 999) {
arr[t] = t;
s++;
}
}
Arrays.sort(arr);//排序
if (arr[0]==1){//存在1的,说明所有数字都可以获得
System.out.println(0);
return;
}
int k = 10001;
for (int i=0;i<s-1;i++){
for (int j=1;j<s;j++){
if(gcd(arr[i],arr[j])==1){
k=Math.min(k,arr[i]*arr[j]);
}
if (k==arr[i]*arr[j]||arr[i]*arr[j+1]>=k)
break;
}
if (arr[i]*arr[i+1]>=k){
break;
}
}//找出乘积最小互质数相乘的结果
int []sk=new int[101];
for (int i=0;i<s;i++){
for (int j=2;j<=arr[i];j++){
if (arr[i]%j==0){
sk[j]++;
}
}
}
Arrays.sort(sk);
if (k>10000&&sk[100]==n){
System.out.println("INF");//不存在互质数,说明全是倍数关系,则有无限多个值无法获得
return;
}
int []crr=new int[k+1];
int []drr=new int[k+1];
int m=0,co,ss;
for (int i=0;i<s;i++){//每一次选择一种包子
co=m;
for (int y=0;y<co;y++){//已经拥有可以获得的包子种类
for (int j=1;j<=(k-drr[y])/arr[i];j++){
ss=drr[y]+arr[i]*j;
if (crr[ss]==0){
crr[ss]=ss;
drr[m]=ss;
m++;
}
}
}
for (int j=1;j<=k/arr[i];j++){
if (arr[i]*j>k){
break;
}
if (crr[arr[i]*j]==0){//说明该值没有出现过
drr[m]=arr[i]*j;
crr[arr[i]*j]=arr[i]*j;//该值已经出现
m++;
}
}
}
System.out.println(k-m);
}
static int nextInt() throws Exception{
st.nextToken();
return (int)st.nval;
}
public static int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
}
三、求值
解析:
这题的话,直接暴力破解就好,值不大!!!
代码:
public class 求值 {
public static void main(String[] args) {
int count=0;
for (int i=1;;i++){
for (int j=1;j<=i;j++){
if(i%j==0){
count++;
}
if(count==100){
System.out.println(i);
return;
}
}
count=0;
}
}
}