| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1675 人关注过本帖
标题:求解一道acm题(问题已解决 感谢各位帮助)
取消只看楼主 加入收藏
zxz10307
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-11-29
收藏
 问题点数:0 回复次数:3 
求解一道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]]
搜索更多相关主题的帖子: 求解 acm 
2008-11-29 11:11
zxz10307
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-11-29
收藏
得分:0 
以下是引用freish在2008-11-29 13:49的发言:

都是整数为什么结果要放到浮点数里面?!
java中int是32位
long是64位,不用担心溢出
直接加
另外用java写最原始的代码是在不好!
放着强大API不用,怎么体现java开发速度呢

java还有BigInteger,溢出实在是 ...


java当然支持64位类型 但32位机上不能识别啊
2008-11-29 14:53
zxz10307
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-11-29
收藏
得分:0 
以下是引用leeco在2008-11-29 15:05的发言:



这只是你的主观臆断,连JAVA最根本的特性都搞不清,JAVA和硬件有什么关系?和操作系统有什么关系?需要考虑是32位机还是64位机这个问题吗?


我是来讨教的,有点言辞不当,大神息怒啊..
我不太清楚它的评测系统是什么样子的,确实java是体系结构独立的,若是通过虚拟机运行的话,就自然没有32位机的问题了
但是此题用java直接写会显示Wrong Answer.我只是想问有什么办法用java写出来

[[it] 本帖最后由 zxz10307 于 2008-11-29 16:46 编辑 [/it]]
2008-11-29 16:42
zxz10307
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-11-29
收藏
得分:0 
多谢各位高手的指点~
尤其感谢版主大人和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);
        }
    }
}
这样就通过了~
2008-11-30 18:34
快速回复:求解一道acm题(问题已解决 感谢各位帮助)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025514 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved