這篇文章通過練習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();
}
}