| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1675 人关注过本帖
标题:求解一道acm题(问题已解决 感谢各位帮助)
只看楼主 加入收藏
zxz10307
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-11-29
收藏
 问题点数:0 回复次数:10 
求解一道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
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
开数组做不就完了

倚天照海花无数,流水高山心自知。
2008-11-29 12:23
freish
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1223
专家分:437
注 册:2007-6-1
收藏
得分:0 
都是整数为什么结果要放到浮点数里面?!
java中int是32位
long是64位,不用担心溢出
直接加
另外用java写最原始的代码是在不好!
放着强大API不用,怎么体现java开发速度呢

java还有BigInteger,溢出实在是无需费劲

[[it] 本帖最后由 freish 于 2008-11-29 13:56 编辑 [/it]]

[url=http://shop63425653./]/cvbnm/a6/1d/f4/7dd1720119cf3b1dcfb570b467b24051.jpg" border="0" />[/url]
2008-11-29 13:49
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
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
以下是引用zxz10307在2008-11-29 14:53的发言:



java当然支持64位类型 但32位机上不能识别啊


这只是你的主观臆断,连JAVA最根本的特性都搞不清,JAVA和硬件有什么关系?和操作系统有什么关系?需要考虑是32位机还是64位机这个问题吗?
2008-11-29 15:05
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
裸写都能过
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
    ll a,b,c;
    while(cin>>a>>b>>c){
        cout<<a+b+c<<endl;
    }
}
2008-11-29 15:10
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
freish
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1223
专家分:437
注 册:2007-6-1
收藏
得分:0 
以下是引用zxz10307在2008-11-29 16:42的发言:



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

直接把三个int相加然后放到long里面就是了嘛
2008-11-29 17:18
elan1986
Rank: 6Rank: 6
等 级:贵宾
威 望:18
帖 子:458
专家分:407
注 册:2007-12-17
收藏
得分:0 
路过 看看
2008-11-29 17:35
freish
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1223
专家分:437
注 册:2007-6-1
收藏
得分:0 
以下是引用zxz10307在2008-11-29 11:11的发言:

此题为http://acm.hit.上的1002 我苦思冥想3天 都无法用java通过
题目如下:
For each pair of integers A B and C ( -2^31  



我随便写了一下,希望有帮助
程序代码:
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/* 
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

 */
public class ACM extends JFrame{
    private Container container;
    private JTextArea area;
    private JButton button;
    public ACM(){
        super("ACM Test");
        container = getContentPane();
        area = new JTextArea(10,20);
        button = new JButton("计算");
        button.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        String[] input = area.getText().trim().split("\\s+");
                        if(input.length%3 != 0){
                            JOptionPane.showMessageDialog(container, "数字的个数应该是3的倍数", "提示信息", JOptionPane.INFORMATION_MESSAGE);
                            return;
                        }
                        
                        //将字符串转换成数字
                        int[] number = new int[input.length];
                        int i = 0;
                        for(String str:input){
                            try{
                                number[i++] = Integer.parseInt(str);
                            }catch(NumberFormatException e){
                                JOptionPane.showMessageDialog(container, "您的输入包含有非数字字符 或 某些数超出了范围", "提示信息", JOptionPane.INFORMATION_MESSAGE);
                                return;
                            }
                        }
                        
                        area.append(cal(number));
                    }
                }
                );
        container.setLayout(new FlowLayout());
        container.add(new JScrollPane(area));
        container.add(button);
        
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        //屏幕居中
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = getSize();
        setLocation((screenSize.width - frameSize.width)/2,(screenSize.height - frameSize.height)/2);
        
        setResizable(false);
        setVisible(true);
    }
    
    
    //计算每三个数相加的结果,并以字符串的形式返回
    public  String cal(int[] num){
        if(num.length%3 !=0)
            return "输入不规范";
        StringBuilder builder = new StringBuilder("\n相加结果\n");
        for(int i=0; i<num.length/3; i++){
            
            /*
             * 下面这一句要注意!必须先将第一个参数强制转换成long,因为三个int相加,结果是int,数太大相加时溢出不会提示
             * 如 int a,b,c; 
             * 给abc赋值
             * long re = a+b+c;  这个执行的情况是这样的:将a+b+c的结果保存到int再转换成long
             * 又如long n = Integer.MAX_VALUE + Integer.MAX_VALUE + Integer.MAX_VALUE,n的结果将是一个Integer.MAX_VALUE
             */
            long result = (long)num[3*i] + num[3*i +1] + num[3*i+2];
            builder.append(result + "\n");
        }
        return builder.toString();
    }
    public static void main(String[] args) {
        new ACM();
    }
}


[[it] 本帖最后由 freish 于 2008-11-29 22:00 编辑 [/it]]

演示.jpg (13.66 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
2008-11-29 18:11
快速回复:求解一道acm题(问题已解决 感谢各位帮助)
数据加载中...
 
   



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

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