求解一道acm题(问题已解决 感谢各位帮助)
此题为http://acm.hit.上的1002 我苦思冥想3天 都无法用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在输出的时候以科学计数法输出...用java的BigDecimal 编译器依然显示wrong answer
但是用c++的fixed却通过了
所以我想到用更原始的方法 写一个加法的算法如下
程序代码:
package acm; import java.util.Scanner; public class Acm1002 { public static void main(String[]args){ int[][]s=new int[3][10]; s=in(); out(Calculate(Calculate(s[0],s[1]),s[2])); /*int a[]=new int[2]; int s[][]=new int[2][10]; for(int i=-1000;i<1000;i++){ for(int j=-1000;j<1000;j++){ a[0]=i; a[1]=j; s=turn(a); System.out.println(i+"+"+j); int[]b=new int[10]; b=Calculate(s[0],s[1]); if(b[0]+b[1]*10+b[2]*100+b[3]*1000!=i+j){ System.out.println("no"); } } }*/ } static int[][] in(){ Scanner cin=new Scanner(System.in); int a[]=new int[3]; a[0]=cin.nextInt(); a[1]=cin.nextInt(); a[2]=cin.nextInt(); return turn(a); } static int[][]turn(int[]a){ int[][]s=new int[3][10]; for(int i=0;i<a.length;i++){ for(int j=0;j<10;j++){ s[i][j]=a[i]%10; a[i]=a[i]/10; } } return s; } 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){ boolean f0=true; for(int i=0;i<10;i++){ if(b[i]!=0) { f0=false; break; } } if(f0){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]); } } }---
利用注释部分进行测试 结果都没有问题
但是依然提示我wrong answer..非常郁闷
不知各位高人有何见教
-----------------------------------
多谢各位高手的指点~
尤其感谢版主大人和lecco达人
问题已经解决了
原来是应嵌入while的问题..我想复杂了
程序代码:
import java.util.Scanner; public class Acm1002test { public static void main(String[]args){ Scanner stdin = new Scanner(System.in); while (stdin.hasNext()) { long a=stdin.nextLong(); long b=stdin.nextLong(); long c=stdin.nextLong(); System.out.println(a+b+c); } } }
这样就通过了~
[[it] 本帖最后由 zxz10307 于 2008-11-30 18:36 编辑 [/it]]