天天看點

藍橋杯刷題java--入門

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