求解一道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]]




