從零開始學Java【基本輸入輸出、排序(sort)、高精度大數運算(BigInteger)】

今天上了第一次Java課,又得從零開始重新學一門新語言了。就像當年學C語言一樣,慢慢做題,熟悉語法。

在oj上做題,可以立即看到正確或者錯誤的反饋,比較有動力。做了四道題,順便懷念一下C++。(不過ACM還是要用C++)

hdu 1000 A + B Problem

初學一門語言,第一個要寫的程序,除了 Hello World,就是 A + B Problem。

import java.util.Scanner;//輸入必須要引用util包中的Scanner類

public class Main {

	public static void main(String [] args) {
	Scanner cin=new Scanner(System.in);//定義輸入的名字,我比較懷念 C++ 的輸入,所以定義成 cin
	while(cin.hasNext()) {
	//用 hasNext() 表示是否遇到了輸入結束標誌,括號內什麼都不加就是輸入到文件末尾才停止
	//比如while(!cin.hasNext("-1"))就是遇到輸入字符串爲"-1"時停止輸入
		int a=cin.nextInt();
		int b=cin.nextInt();
		System.out.println(a+b);	
	}
	}
}

洛谷 P1177 【模板】快速排序

Java的Arrays類中有sort,可以直接排序,內部原理是根據數據元素整體分佈確定排序方法,時間複雜度應該是穩定的O(n*logn)。

import java.util.Scanner;
import java.util.Arrays;//數組中進行排序需要Arrays類

public class Main {

	public static void main(String [] args) {
	Scanner cin=new Scanner(System.in);
	int n=cin.nextInt();
	int a[]=new int[n];
	//這裏用定義數組的大小爲n,是因爲有多大開多大,如果大小超過n,則後面未賦值的元素默認爲0,
	//則0成爲了最小的元素,原數組中不存在的0排在前面,顯然是錯誤輸出
	for(int i=0;i<n;i++)
		a[i]=cin.nextInt();
	Arrays.sort(a);
	for(int i=0;i<n;i++)
		System.out.print(a[i]+" ");
	}
}          

hdu 1002 A + B Problem II

高精度運算,比如大數加法,用Java很方便,有現成的數據類型可以直接用(這讓C++情何以堪!)。
理論上Java中的BigInteger類可以支持無限長的大數運算(只要內存夠),BigInteger支持加減乘除運算。

import java.util.Scanner;
import java.math.BigInteger;//用大數類型必須引入math包中的BigInteger類

public class Main {
	public static void main(String [] args) {
		Scanner cin=new Scanner(System.in);
		int T=cin.nextInt();
		for(int cas=1;cas<=T;cas++){
			BigInteger a=cin.nextBigInteger();
			BigInteger b=cin.nextBigInteger();
			System.out.printf("Case %d:%n",cas);//這裏寫成%s格式也行
			//注意換行的格式不要寫成\n,否則會PE(估計是杭電的編譯器太老了不支持)
            System.out.printf("%d + %d = %d%n",a,b,a.add(b));//這裏我試了一下,%d格式 或 %s格式 都行
			if(cas<T)System.out.println();//換行
		}	
	}
}

湖南大學第十四屆ACM程序設計新生杯(重現賽)G題 a+b+c+d=?

Java做法:

BigInteger初始化爲0可以寫 BigInteger ans=BigInteger.ZERO; 或者 BigInteger ans=new BigInteger("0");

import java.util.Scanner;
import java.math.BigInteger;
 
public class Main {
    public static void main(String [] args) {
        Scanner cin=new Scanner(System.in);
        int T=cin.nextInt();
        while(T--!=0) {//注意T組輸入這裏和C++不一樣,要寫!=0,否則會報錯
            //BigInteger ans=new BigInteger("0");
            BigInteger ans=BigInteger.ZERO;//初始化ans爲0,即BigInteger ans=new BigInteger("0");
            for(int i=0;i<4;i++) {
                BigInteger x=cin.nextBigInteger();
                ans=ans.add(x);
            }
        System.out.println(ans);
        }  
    }
}

C++做法:

當然,這題用C++也是能做的,而且不寫高精度也能做。
這題出題人應該是特意卡了long long和unsigned long long的範圍。
a+b+c+d,四個數相加,答案最大是4*261=263,最小是-263,而且我們必須要知道:

long long範圍[-263,263-1]
unsigned long long範圍[0,264-1]

所以我們只需要特判四個數都爲261的情況,答案是263,這個時候long long會溢出,直接用unsigned long long格式輸出263即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll T,a[5];
int main()
{
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--)
    {
        ll ans=0;
        for(int i=1;i<=4;i++)
        {
            cin>>a[i];
            ans+=a[i];
        }
        if(a[1]>=0&&a[2]>=0&&a[3]>=0&&a[4]>=0&&ans<0)printf("%llu\n",1ull<<63);//ans溢出爲負數
        else printf("%lld\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章