| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3076 人关注过本帖
标题:一个oj的题,测试数据都对,就是提交错误
取消只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:6 
一个oj的题,测试数据都对,就是提交错误
A+B Problem IV
时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
输入
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
样例输入
1.9 0.1
0.1 0.9
1.23 2.1
3 4.0
样例输出
2
1
3.33
7


#include <iostream>
using namespace std;

bool flag;//标记是否小数部分向整数部分有进位

//计算整数部分的加法
string add_Int(string s1,string s2)
{
    if(s1.length()<s2.length())
    {
        string t=s1;
        s1=s2;
        s2=t;
    }
    for(int i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    {
        s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
        
        if(s1[i]-'0'>=10)
        {
            s1[i]=char((s1[i]-'0')%10+'0');
            if(i)
                s1[i-1]++;
            else
                s1="1"+s1;
        }
    }
    return s1;
}
//计算小数部分的加法
string add_Dec(string s1,string s2)
{
    //如果小数的位数不相同
    if(s1.length()!=s2.length())
    {
        if(s1.length()<s2.length())
        {
            string t=s1;
            s1=s2;
            s2=t;
        }
        for(int i=s2.length()-1,j=s2.length()-1;i>=0;i--,j--)
        {
            s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
            
            if(s1[i]-'0'>=10)
            {
                s1[i]=char((s1[i]-'0')%10+'0');
                if(i)
                    s1[i-1]++;
                else
                    flag=true;
            }
        }
    }
    //小数部分位数不同
    if(s1.length()==s2.length())
    {
        for(int i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
        {
            s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
            
            if(s1[i]-'0'>=10)
            {
                s1[i]=char((s1[i]-'0')%10+'0');
                if(i)
                    s1[i-1]++;
                else
                    flag=true;
            }
        }
    }
    return s1;
}
 
int main()
{
    string s1,s2;
    while(cin>>s1>>s2)
    {
        string s1_Int,s1_Dec,s2_Int,s2_Dec;
        //s1的整数部分,s1的小数部分 ,s2的整数部分,s2的小数部分
        
        int s1_find=s1.find('.');//找到小数点的位置,把整数和小数分开来计算
        if(s1_find!=-1)//如果存在小数点
        {
            for(int i=0;i<s1.find('.');++i)
                s1_Int+=s1[i];
            for(int i=s1.find('.')+1;i<s1.length();++i)
                s1_Dec+=s1[i];
        }
        if(s1_find==-1)//如果不存在小数点
        {
            s1_Int+=s1;
            s1_Dec+="0";
        }
        
        int s2_find=s2.find('.');//s2的小数点的位置
        if(s2_find!=-1)//如果存在小数点
        {
            for(int i=0;i<s2.find('.');++i)
                s2_Int+=s2[i];
            for(int i=s2.find('.')+1;i<s2.length();++i)
                s2_Dec+=s2[i];
        }
        if(s2_find==-1)//如果不存在小数点
        {
            s2_Int+=s2;
            s2_Dec+="0";
        }
        
        flag=false;//默认为false如果有小数部分进位,则值为true
        string t_Dec=add_Dec(s1_Dec,s2_Dec);//先做小数部分的加法
     
        string t_Int_Carry;//小数加法时向正数有进位
        string t_Int;//小数加法向正数没有进位
   
        if(flag)// 如果小数部分向整数部分有进位
            t_Int_Carry=add_Int(add_Int(s1_Int,s2_Int),"1");
        else//小数部分向整数部分没有进位
            t_Int=add_Int(s1_Int,s2_Int);
        
        if(t_Dec=="0")//如果小数部分为零
            if(flag)//小数部通过向整数部分进位 产生的0
                cout<<t_Int_Carry<<endl;
            else//两个数本来都为整数
                cout<<t_Int<<endl;
        else//小数部分不为零
            cout<<t_Int<<"."<<t_Dec<<endl;
    }
    return 0;
}
搜索更多相关主题的帖子: 小数 整数 string int length 
2018-05-23 22:58
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 3楼 lin5161678
小数点位置不同不好对齐。
2018-05-24 12:35
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 5楼 lin5161678
好的,我试试。
2018-05-24 23:07
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 6楼 wmf2014
好的 谢谢。
2018-05-24 23:07
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 6楼 wmf2014
我加了如下代码,能解决您说的9.999999 0.000001 你的代码输出是:10.000000,根据题意应该是10这个问题。
//计算小数部分的加法
string add_Dec(string s1,string s2)
{
    //如果小数的位数不相同
    if(s1.length()!=s2.length())
    {
        if(s1.length()<s2.length())
        {
            string t=s1;
            s1=s2;
            s2=t;
        }
        for(int i=s2.length()-1,j=s2.length()-1;i>=0;i--,j--)
        {
            s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
            
            if(s1[i]-'0'>=10)
            {
                s1[i]=char((s1[i]-'0')%10+'0');
                if(i)
                    s1[i-1]++;
                else
                    flag=true;
            }
        }
    }
    //小数部分位数不同
    if(s1.length()==s2.length())
    {
        for(int i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
        {
            s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
            
            if(s1[i]-'0'>=10)
            {
                s1[i]=char((s1[i]-'0')%10+'0');
                if(i)
                    s1[i-1]++;
                else
                    flag=true;
            }
        }
        bool flag1=true;
        for(int i=s1.length()-1;i>=0;--i)
            if(s1[i]!='0')
            {
                flag1=false;
                break;
            }
        if(flag1)
        {
            s1.clear();
            s1+="0";
        }

    }
   
    return s1;
}
2018-05-24 23:50
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 10楼 wmf2014
我感觉您的代码也没什么逻辑问题。。。
2018-05-29 22:22
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 11楼 wmf2014
我前几天打ACM也有报错,不会是这问题吧。。。。。

不都是window下是Ctrl+Z Linux下是Ctrl+D
2018-05-29 22:25
快速回复:一个oj的题,测试数据都对,就是提交错误
数据加载中...
 
   



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

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