第十三届蓝桥杯大赛软件赛省赛Java 大学 B 组(前两道填空题)

试题 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数组,只含有两个元素,第一个是商,第二个是余数,代码如下
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的基础知识掌握牢固。加油,不断学习,提升自己。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KD66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值