遇到一诡异的acm题 如下:
For each pair of integers A B and C ( -2^31 <= A, B, C<= 2^31-1 ), Output the result of A+B+C on a single line.
Sample Input
1 2 3
3 4 3
Sample Output
6
10
提示 请注意32位机上int的表示范围。
---------------------------
在32位机上int和long相等 那么三个数的和就会超过long的范围 所以只能用double计算
但是double在输出的时候以科学计数法输出...
那么如何以整数输出一double而不转long类型呢?
题目为http://acm.hit.edu.cn/index.php的1002题 如果有达人用java写出来 分数将送上
For each pair of integers A B and C ( -2^31 <= A, B, C<= 2^31-1 ), Output the result of A+B+C on a single line.
Sample Input
1 2 3
3 4 3
Sample Output
6
10
提示 请注意32位机上int的表示范围。
---------------------------
在32位机上int和long相等 那么三个数的和就会超过long的范围 所以只能用double计算
但是double在输出的时候以科学计数法输出...
那么如何以整数输出一double而不转long类型呢?
题目为http://acm.hit.edu.cn/index.php的1002题 如果有达人用java写出来 分数将送上
public class Acm1002 {
public static void main(String[]args){
Scanner cin=new Scanner(System.in); int a=cin.nextInt();
int b=cin.nextInt();
int c=cin.nextInt();
double d=(double)a+b+c;
if(d>2147483647||d<-2147483648){
double e=d/1000000000;
double f=(int)e;
double g=d-f*1000000000;
double h=(int)g;
System.out.println(""+(int)f+(int)Math.abs(h));
}
else
System.out.println((int)d);
}
}
这样还是wrong answer....我败了
求救
看这句话就知道这不是个java问题了。
可将double转换成BigDecimal类,再进行输出,或计算。
如:
double dbl= 6.456E3;
BigDecimal dec = new BigDecimal(dbl);
dec.toString();
写了一个比较原始的算法 不过还是wrong answer..不知为何..求教import java.util.Scanner;
public class Main {
public static void main(String[]args){
Scanner cin=new Scanner(System.in);
int a[]=new int[3];
a[0]=cin.nextInt();
a[1]=cin.nextInt();
a[2]=cin.nextInt();
int[][]s=new int[3][10];
for(int i=0;i<3;i++){
for(int j=0;j<10;j++){
s[i][j]=a[i]%10;
a[i]=a[i]/10;
}
}
out(Calculate(Calculate(s[0],s[1]),s[2]));
}
static int Fun(int[]a){
for(int i=0;i<10;i++){
if(a[i]<0)return -1;
}
return 1;
}
static int[] Addition(int[]a,int[]b){
int e=0;
int[]c=new int[10];
for(int i=0;i<10;i++){
int t=a[i]+b[i]+e;
c[i]=t%10;
e=t/10;
}
return c;
}
static int[]Minus(int[]a,int[]b){
int e=0;
int[]c=new int[10];
for(int i=0;i<10;i++){
if(a[i]-e>=b[i]){
c[i]=a[i]-b[i]-e;
e=0;
}
else{
c[i]=a[i]-b[i]+10-e;
e=1;
}
}
return c;
}
static boolean Compare(int[]a,int[]b){
for(int i=9;i>=0;i--){
if(a[i]<b[i]) return false;
if(a[i]>b[i]) return true;
}
return true;
}
static int[] Opp(int[]a){
int[]b=new int[10];
for(int i=0;i<10;i++){
b[i]=-a[i];
}
return b;
}
static int[] Calculate(int []a,int[]b){
int[]temp=new int[10];
if(Fun(a)*Fun(b)==1){
temp=Addition(a,b);
}
else{
if(Fun(a)==-1){
if(Compare(Opp(a),b)){
temp=Opp(Minus(Opp(a),b));
}
else
temp=Minus(b,Opp(a));
}
else{
if(Compare(a,Opp(b))){
temp=Minus(a,Opp(b));
}
else
temp=Opp(Minus(Opp(b),a));
}
}
return temp;
}
static void out(int[] b){
for(int i=0;i<10;i++){
if(b[i]!=0) break;
if(i==9 &&b[9]==0){ System.out.print(0);return;}
}
boolean f=false;
boolean f2=true;
for(int i=0;i<10;i++){
if(b[i]<0)f=true;
}
if(f){
System.out.print("-");
for(int i=9;i>=0;i--){
if(f2){
if(b[i]==0)continue;
else f2=false;
}
System.out.print(Math.abs(b[i]));
}}
else
for(int i=9;i>=0;i--){
if(f2){
if(b[i]==0)continue;
else f2=false;
}
System.out.print(b[i]);
}
}
}