遇到一诡异的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写出来 分数将送上

解决方案 »

  1.   

    import java.util.Scanner;
    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....我败了 
    求救
      

  2.   

    在32位机上int和long相等
    看这句话就知道这不是个java问题了。
      

  3.   

    科学计数法问题比较容易解决,在JAVA里,double不是精确的计算方法。
    可将double转换成BigDecimal类,再进行输出,或计算。
    如:
    double dbl= 6.456E3;
    BigDecimal dec = new BigDecimal(dbl);
    dec.toString();
      

  4.   

    用BigDecimal还是无法通过 莫非是评测系统不支持?
    写了一个比较原始的算法 不过还是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]);
    }
    }
    }