蓝桥杯(java):序列求和,圆的面积,Fibonacci数列,01字串,字母图形

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41500251/article/details/84900511

人生无趣,生活不易,一起找点乐子吧。欢迎点评评论,也希望不惜赐教。

 

 

报了蓝桥杯,虽然几个月后才考,但也不影响准备。(一只用的是python,没办法,要回去重拾java)蓝桥杯的练习系统有好多题,不防大家一起来做做吧。一边复习着java语法,一边学着新内容。(做好笔记,开始了。)

 

A+B问题没有东西,直接忽略,

一、序列求和:

问题描述
求1+2+3+...+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+...+n的值。
样例输入
4
样例输出
10
样例输入
100
说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。

一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。

样例输出
5050
数据规模与约定
1 <= n <= 1,000,000,000。

要点也不多:

一、计算思维。循环累加当然没问题,时间长而已,还有就是显得自己不是很聪明。(舍友说看到有篇博客说“要用三分之二的时间去思考,剩下的时间足够写代码”)高中学了一堆等差等比数列什么的,别丢了,这里计算的时候直接用求和公式。sum = n*(n+1) / 2。

二、考虑数据规模。我用python的时候从来不考虑这一点,这里也是需要在意识方面注重的一点。题中都为整数,我们理应想到的就是直接用int定义变量就完,那个程序应该能得80分吧。剩下的分数就是计算时溢出导致的错误。(简单说下溢出,我们声明变量时的类型,不是没有用,你站在计算机的角度考虑,我要告诉计算机我要存储个什么类型的数据,你给我留出来多大的空间。也就是说,类型不同,数据的存储空间是不一样大的,当计算数据大于这个空间所能表示的最大范围的时候,溢出值【或者说我们计算时候的进位】就会被舍去,从而使得结果错误。)问题来了,int能表示多大的数呢?大家可以输出一下Integer.MAX_VALUE来看下。大概二十一亿,也就是说当数据计算超过这个值得时候,就不能再用int或者integer去声明了。(这里说一下int和integer的区别,integer是个包装类,所以我们才能用 . 去调用他的MAXVALUE)

用Long,实例代码:

import java.util.*;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		Long num = sc.nextLong();
		Long sum = num*(num+1)/2;
		System.out.print(sum);
	}
}

来看下integer类型所能表示的最大值:

public class test {
	public static void main(String args[]){
		System.out.print(Integer.MAX_VALUE);
	}
	
}

 

 

 

ok,没说的了,下一题。

二、圆的面积:

问题描述
给定圆的半径r,求圆的面积。
输入格式
输入包含一个整数r,表示圆的半径。
输出格式
输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。
说明:在本题中,输入是一个整数,但是输出是一个实数。

对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入
4
样例输出
50.2654825
数据规模与约定
1 <= r <= 10000。

需要注意的点就是输出要求,严格输出7位小数,这也同时要求π的精度要足够高,不能随便去定义个3.14用。其次还是那个问题,数据规模,如果r为10000,π*r^2显然已经超出Integer所能表达的最大值。何况输出要求小数,所以变量类型直接用double好了。

至于输出的格式化,我们还有个printf语句,当成c去规范数据就好。

实例代码:

import java.util.*;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		double r = sc.nextInt();
		sc.close();
		double PI = Math.atan(1)*4;//直接用MATH.PI也可以。精确到小数点后十五位
		double area = PI*r*r;
		System.out.printf("%.7f",area);
	}
}

 

三、Fibonacci数列:

问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。

首先看数据规模,n偏大时计算结果又超出了Integer的上限。又要用Long了吗?本来我也这么想到,但是官网给了你个锦囊,你没必要保存Fn-1+Fn-2的值,因为越到后面越大,存储空间和计算时间都会增大,直接存他们两个除10007的余数。不懂?

我们最后要输出的是Fn除以10007的余数,Fn%10007 = (Fn-1+Fn-2)%10007 = Fn-1 % 10007+Fn-2 % 10007。

这样懂了吗,有什么好处呢?就是我们需要存储的Fn不会超过10006*2,也就可以去用int类型直接存储了。

还有一点值得注意,n=1,2为特殊值,记得特殊处理,因为2以后我们才根据前两个值推出,1和2不满足条件。

import java.util.*;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		sc.close();
		int a = 1;
		int b = 1;
		int c = 0;
		if(num == 1 || num == 2){//特殊情况
			System.out.println(1);
		}else{
			
		
		for(int i = 3;i<=num;i++){//一般情况
			c = (a + b)%10007;
			a = b;
			b = c;
		}
		System.out.println(c);
		}
	}
}

 

基础训练:闰年判断就不用说了吧,没点,一个判断而已。

01字串:

问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>

这个有趣,总结下就是,从小到大输出0-31的二进制表示。

官网的锦囊不是盖的!!!强的一批,用五层循环。。。。。。

他可能只是想让你练习一下循环(我想不到其他能被称为锦囊的原因。。。。。。):

import java.util.*;

public class Main {
	public static void main(String args[]){
		for(int i=0;i<=1;i++){
			for(int j=0;j<=1;j++){
				for(int k=0;k<=1;k++){
					for(int m=0;m<=1;m++){
						for(int n=0;n<=1;n++){
							System.out.println(""+i+j+k+m+n);
						}
					}
				}
			}
		}
	}
}

好吧,我写的是这样的,看着怎么说呢?不优雅。。。Stupid!

笔记点:这里有个方法Integer.toBinaryString(int),把数值变成二进制串,所以。。。。

public class Main {
	public static void main(String args[]){
		for(int i = 0;i<32;i++){					
			System.out.println(s+Integer.toBinaryString(i));
		}
	}
	
}

结束啦?嗯。。。没有,有点问题,比如:

前几位的输出不对,不够五位的需要零补齐,样例输出

所以代码处里字串长度就好了。

public class Main {
	public static void main(String args[]){
		int len;
		int zero;
		String s="";
		for(int i = 0;i<32;i++){
			len = Integer.toBinaryString(i).length();
			if(len != 5){//小于五位的补齐
				zero = 5-len;
				for(int j = 0;j<zero;j++)
					s += "0";
			}
				
			System.out.println(s+Integer.toBinaryString(i));
			s = "";//s归零用于下次循环
		}
	}
	
}

看上去没那么蠢了吧,不懂五层循环为何称为锦囊,人工思考少吗?大家有更好的办法,欢迎下面评论。

 

 

字母图形:

问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。

我觉得重点在于找到规律,看官网锦囊:

下标差的绝对值是0的为A,1的为B。。。依次类推,枚举所有的的差值,然后按照坐标差输出。

说实话,我没看锦囊之前,我并没有发现,我看到的规律是ABCDE......,第n行这串字母向右位移n-1位,前n-1位是以A为镜像的字母输出。像这样:

也就是说字母串是个从Z到A再到Z的一串,由输入知道从A开始框住几位,以后每一行的输出,只是把框左移一位而已。我也不知道为什么会想到这种方法,可能是对数字不敏感吧。

看代码:

import java.util.*;

public class Main{
public static void main(String args[]){
	Scanner sc = new Scanner(System.in);
	int n = sc.nextInt();
	int m = sc.nextInt();
	sc.close();
	String s = "ZYXWVUTSRQPONMLKJIHGFEDCBABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for(int i=0;i<n;i++){//位移框
		System.out.println(s.substring(25-i, 25-i+m));//根据m取几位
	}
}
}

我觉得很巧妙,(自恋一下~)

 

 

写完了,这次写了五道题,每次写五道吧。看看能写多少,我把笔记留在下面。

 

 

 

 

 

 

java笔记:

1、计算中的整数结果超过二十一亿的时候,声明变量,要用Long代替int或integer。

2、PI的取值,可以直接引用MATH.PI,或通过反三角函数进行运算。

3、当需要对输出格式化时,我们还有printf语句。

4、将十进制数字转换为二进制串,我们有Integer.toBinaryString(int)方法。

5、字符串取字串有string.subString(start,end)方法,前闭后开。

猜你喜欢

转载自blog.csdn.net/qq_41500251/article/details/84900511