| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2585 人关注过本帖, 1 人收藏
标题:高精度加法
只看楼主 加入收藏
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
结帖率:71.43%
收藏(1)
已结贴  问题点数:10 回复次数:10 
高精度加法
这个题,我提交后所有的测试数据都是错的,但我按照测试数据运行的结果都对啊,不知道怎么回事,求大神教
本小白的代码风格介于c++和c之间。。。求勿喷

/*
问题描述
  输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数
存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该
是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即
可求出
C的所有位。
  最后将C输出即可。
输入格式
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
  输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
*/
#include<iostream>
#include<string>
using namespace std;
int main(){
    int a[100],b[100],sum[110],r=0,la=0,lb=0,i=0,j=0,k=0,ii=0;
    string s;
   
    cin>>s;
    while(s[la]){
        a[la++]=s[la]-'0';
    }
    cin>>s;
    while(s[lb]){
        b[lb++]=s[lb]-'0';
    }
   
   
    for(i=la-1,j=lb-1,k=0;i>=0&&j>=0;i--,j--,k++){
        sum[k]=(a[i]+b[j]+r)%10;
        r=(a[i]+b[j]+r)/10;
    }
   
   
    if(la==lb){
        while(--la>=0)cout<<sum[la];
    }
    else if(la>lb){
        sum[k]=a[i]+r;
        while(--i>=0){
            sum[++k]=a[i];
        }
        while(--la>=0)cout<<sum[la];
   
    }
    else{
         sum[k]=b[j]+r;
        while(--j>=0){
            sum[++k]=b[j];
        }
        while(--lb>=0)cout<<sum[lb];
        
    }
    return 0;
}
搜索更多相关主题的帖子: 风格 
2017-04-07 15:13
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:1 
a[i++] = i

未定义行为

[此贴子已经被作者于2017-4-7 15:48编辑过]



[fly]存在即是合理[/fly]
2017-04-07 15:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:1 
回复 2楼 azzbcc
对 C语言 而言是 未定义行为
对 C++语言 而言是 确定行为
2017-04-07 15:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:1 
我输入
2
9
你的代码输出了1

2017-04-07 15:53
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
收藏
得分:0 
回复 3楼 rjsp
什么叫做定义行为呀?

元气少女Leo_L
2017-04-07 16:02
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
收藏
得分:0 
回复 3楼 rjsp
所以我是需要把这个拆开写对咩?

元气少女Leo_L
2017-04-07 16:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
曾经做过大位数乘法~里面已经包括了大位数加法了~先忽略~看看我现在能不能看懂你那个C++~应该是进位问题~

[此贴子已经被作者于2017-4-7 16:13编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-07 16:08
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 3楼 rjsp
还是没查清楚就写了

r版有相关资料的地址么?

这一块还是得看看。下次不乱说了。



[fly]存在即是合理[/fly]
2017-04-07 16:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:1 
回复 8楼 azzbcc
C: http://en.
C++: http://en.
2017-04-07 16:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:3 
回复 6楼 Leo_L
随手写了一个,下班了,未检查
程序代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main( void )
{
    string a, b, c;
    cin >> a >> b;

    std::reverse( a.begin(), a.end() );
    std::reverse( b.begin(), b.end() );
    a.resize( std::max(a.size(),b.size())+1, '0' );
    b.resize( a.size(), '0' );
    c.resize( a.size(), '0' );

    unsigned carry = 0;
    for( size_t i=0; i!=a.size(); ++i )
    {
        carry += (a[i]-'0') + (b[i]-'0');
        c[i] = carry%10 + '0';
        carry /= 10;
    }

    if( c[c.size()-1] == '0' )
        c.erase( c.size()-1 );
    std::reverse( c.begin(), c.end() );

    cout << c << endl;

    return 0;
}

2017-04-07 16:34
快速回复:高精度加法
数据加载中...
 
   



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

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