今天上了第一次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;
}