这篇文章通过练习3道入门题以熟练蓝桥杯的系统。
以及一道基础练习题。
入门练习一:
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
if(n==1||n==2)
System.out.println(1);
else
{
int[] arr=new int[n+1];
arr[1]=1;
arr[2]=1;
if(n>2)
{
for(int i=3;i<=n;i++)
arr[i]=(arr[i-1]+arr[i-2])%10007;
}
System.out.println(arr[n]);
}
}
}
这道题主要是不能够先求值再求余数,这样容易超出范围
入门练习二:
给定圆的半径r,求圆的面积。
输出格式
输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。
本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4
这道题主要注意如何使用占位符。以及pi的计算。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
double PI=4*Math.atan(1.00);//
double area=n*n*PI;
System.out.printf("%.7f",area);//
}
}
入门练习三:
求1+2+3+…+n的值。
说明:请注意这里的数据规模。
本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。
本题另一个要值得注意的地方是==答案的大小不在你的语言默认的整型(int)范围内,==如果使用整型来保存结果,会导致结果错误。
这道题要注意两点:
1.不能用循环累加,于是我们使用公式,也就是高斯先生当年能够成功收获一众少女芳心的解法。
2.这道题的说明提醒我们答案的大小不在整型 int 范围内,于是我很开心的不去将结果赋值给某一变量,这样就省的定义变量的类型。然而我只有50分。代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
System.out.println(n*(1+n)/2);
}
}
于是我左思右想,终于明白了,因为输入n的值是 int 类型的,对int 类型的操作所返回的结果也默认是 int 类型的,所以,只要将 n 的类型改一下即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner scn=new Scanner(System.in);
long n=scn.nextInt();
System.out.println(n*(1+n)/2);
}
}
大数进制转换
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路:我本来以为它非常简单,利用Java自带的library就很轻松解决。先将16进制通过valueOf()转化为10进制,然后通过Integer.toOctalString(int )转化为八进制就可以了。
结果我发现这样子是不行的,这玩意是大数!得用字符串。
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
其他进制转为十进制:
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()
parseInt(String s, int radix)
使用第二个参数指定的基数,将==字符串参数==解析为有符号的整数。
于是就需要将输入的十六进制数转化为2进制,然后将2进制再转化为8进制。
import java.util.Scanner;
import java.lang.Integer;
public class Main {
public static void main(String[] args)
{
Scanner scn=new Scanner(System.in);
int n=scn.nextInt();
String[] arr=new String[n];
for(int i=0;i<n;i++)
{
arr[i]=scn.next();
}
for(int i=0;i<n;i++)
{
arr[i]=toBinary(arr[i]);
if(arr[i].length()%3==1)
arr[i]="00"+arr[i];
else if(arr[i].length()%3==2)
arr[i]="0"+arr[i];
System.out.println(toOca(arr[i]));
}
}
public static String toOca(String s1)
{
StringBuffer a=new StringBuffer();
String s=s1.substring(0,3);
int k=0;
if(s.equals("000"))
k=3;
for(int j=k;j<s1.length()-2;j=j+3)
{
s=s1.substring(j, j+3);
if(s.equals("000"))
a.append("0");
else if(s.equals("001"))
a.append("1");
else if(s.equals("010"))
a.append("2");
else if(s.equals("011"))
a.append("3");
else if(s.equals("100"))
a.append("4");
else if(s.equals("101"))
a.append("5");
else if(s.equals("110"))
a.append("6");
else if(s.equals("111"))
a.append("7");
}
return a.toString();
}
public static String toBinary(String s)
{
StringBuffer b=new StringBuffer();
for(int k=0;k<s.length();k++)
{
String s1=s.substring(k, k+1);
if(s1.equals("0"))
b.append("0000");
else if(s1.equals("1"))
b.append("0001");
else if(s1.equals("2"))
b.append("0010");
else if(s1.equals("3"))
b.append("0011");
else if(s1.equals("4"))
b.append("0100");
else if(s1.equals("5"))
b.append("0101");
else if(s1.equals("6"))
b.append("0110");
else if(s1.equals("7"))
b.append("0111");
else if(s1.equals("8"))
b.append("1000");
else if (s1.equals("9"))
b.append("1001");
else if(s1.equals("A"))
b.append("1010");
else if(s1.equals("B"))
b.append("1011");
else if(s1.equals("C"))
b.append("1100");
else if (s1.equals("D"))
b.append("1101");
else if(s1.equals("E"))
b.append("1110");
else if(s1.equals("F"))
b.append("1111");
}
return b.toString();
}
}