试题 A: 星期计算
本题总分:
5
分
【问题描述】
已知今天是星期六,请问
20
22
天后是星期几?
注意用数字
1
到
7
表示星期一到星期日。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解法一:看到这种题目我当时就是想得求20的22次方,但是算出来太大了,这里边需要使用到BigInteger。
先来简单看一下BigInteger如何操作比较大的整数,放在java.math里面。
public BigInteger(String val)//构造方法,传入一个字符串
public BigInteger add(BigInteger val)//加法
public BigInteger subtract(BigInteger val)//减法
public BigInteger multiply(BigInteger val)//乘法
public BigInteger divide(BigInteger val)//除法
public BigInteger[] divideAndRemainder(BigInteger val)//除法求商取模
其中divideAndRemainder()方法可以求两个数的商和余数,它的返回值是一个BigInteger数组,只含有两个元素,第一个是商,第二个是余数,代码如下
public BigInteger add(BigInteger val)//加法
public BigInteger subtract(BigInteger val)//减法
public BigInteger multiply(BigInteger val)//乘法
public BigInteger divide(BigInteger val)//除法
public BigInteger[] divideAndRemainder(BigInteger val)//除法求商取模
其中divideAndRemainder()方法可以求两个数的商和余数,它的返回值是一个BigInteger数组,只含有两个元素,第一个是商,第二个是余数,代码如下
import java.math.BigInteger;
import java.util.*;
public class cesi {
public static void main(String args[]) {
BigInteger base=new BigInteger("20");
int pow=20;
BigInteger re=base.pow(pow);//求20的22次方
BigInteger w=new BigInteger("7");
BigInteger[] ans=re.divideAndRemainder(w);//商和余数
System.out.println(ans[0]);//商
System.out.println(ans[1]);//余数
}
}
结果截图
因为今天是星期六,通过计算我们发现还余下一天,6加1是七,所以答案是星期七。
解法二:直接用常规方法,常规数据用pow函数求得20的22次方,然后对7取余
附上代码
import java.math.BigInteger;
import java.util.*;
public class cesi {
public static void main(String args[]) {
double a = Math.pow(20, 22);
double c = a % 7;
System.out.println(c);
}
}
结果截图
因为今天是星期六,通过计算我们发现还余下一天,6加1是七,所以答案是星期七。
试题 B: 山
本题总分:
5
分
【问题描述】
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如
123565321
、
145541
,它
们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间
[2022
,
2022222022]
中有
多少个数的形状像一座“山”
思路:首先将数字转变为数组,然后比较是否满足左右对称以及数位上的数字先单调不减,后单调不增。但是为了不出错,我建议将其中满足条件的数值打印出来,以方便自己检查是否漏掉数字,避免小错误。尤其是要注意比较的临界条件。
代码如下:
import java.math.BigInteger;
import java.util.*;
public class cesi {
public static void main(String args[]) {
int a=2022;
int b=2022222022;
int ans=0;
for(int i=a;i<=b;i++) {
String ss = String.valueOf(i);
char aa[] = ss.toCharArray();//将数字变为数组,方便比较数据
if ((fun(aa) == 1)&&(funn(aa)==1)) {
System.out.println(aa);
ans++;
}
}
System.out.println(ans);
}
public static int fun(char a[])//判断是否满足回文字符的要求
{
for(int i=0;i<a.length/2;i++)//注意只需要比较到数组长度的一半就行了
{
if(a[i]!=a[a.length-1-i])
{
return 0;
}
}
return 1;
}
public static int funn(char []a)//判断是否满足数位上的数字先单调不减,后单调不增。
{
for(int i=0;i<a.length/2;i++)
{
if(a[i]>a[i+1])
{
return 0;
}
}
return 1;
}
}
结果截图
即最后答案为3138.
总结:总的来说,这次的填空题不难,但是需要我们仔细细心,注意细节,并且对java的基础知识掌握牢固。加油,不断学习,提升自己。