问题标题: 酷町堂:高精度加法

0
0
已解决
丁政元
丁政元
初级光能
初级光能
#include<fstream>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
    char a[999],b[999];
    int in_a[999],in_b[999],in_c[1600],tm;
    cin>>a>>b;
    if(a<b){
        swap(a,b);
    }
    tm=strlen(a);
    for(int i=tm;i>0;i--){
        in_a[i]=a[i]-'0';
        tm--;
    }
    tm=strlen(a);
    for(int i=tm;i>0;i--){
        in_b[i]=b[i]-'0';
        tm--;
    }
    for(int i=0;i<=strlen(a);i++){
        in_c[i]=in_a[i]+in_b[i];
        if(in_a[i]+in_b[i]>=10){
            in_c[i]%=10;
            in_c[i+1]++;
        }    
    } 
    for(int i=strlen(a);i>0;i--){
        cout<<in_c[i];
    } 
return 0;
}

怎么做???


0
已采纳
尹宗鑫
尹宗鑫
新手守护
新手守护

高精度加法:先把字符数组转换成数字相加 ,如果有进位,本位减10,高位进1高精度加法:可以进行10位以上到200以内的加法。不能用整形(最多9位有效)读入字符串。21,0000,0000

 

string a="123"; a.length()=3;

 a[0]='1'; a[1]='2';a[2]='3';

 

 string b="4567";

  最高位 b[0]='4'...b[4-1]='7'

默认:b[0]是最高位,b[串长-1]是个位

    

   a[0]a[1]  a[2]

   3     2    1

+  7     6    5     4  

   b[0] b[1] b[2] b[3]

------------

(1)先把字符串s1倒序放在数组a中

(默认a[0]是最高位,a[s1.length()-1]是个位),

倒序后a[1]放个位,a[s1.length()]放最高位

同样:b[1]放个位,b[s2.length()]放最高位,

(2)个位开始对应相加;

 

字符ASCII:  ‘a’—97   ‘A’—65  ‘0’--48

 

 

  string s1="345";La=3

  

  s1[0]='3'  s1[1]='4',s1[2]='5';

 a[1]=5=s1[2]   a[2]=4=s1[1]  a[3]=3=s1[0];

 a[i]=s1[La-i]-'0';

 

string  s2="6789"; La=4

 s2[0]='6',s2[1]='7',s2[2]='8',s2[3]='9'

a[1]=9=s2[3], a[2]=8=s2[2]...

 

高精度加法:1、先把两个串倒序放在a[],b[]数组中,每个字符放一个数组位置,

a[1]-b[1]放个位;//s1=”1235677894554654”->a[1]=4,a[2]=5,a[3]=6.

2、为了确保a+b放在a中,必须La>=Lb;

if(La<Lb)  {swap(a,b); swap(La,Lb);}//交换两个数组

3、从个位i=1到LA;i++

 {

a[i]=a[i]+b[i];//对应位相加

if(a[i]>=10)//有进位

{ a[i+1]++; //向i+1进1

a[i]=a[i]-10;//本位减10

}

}

4、打印—从高La到个位1打印(有可能La+1有数)  99+3

if(a[La+1]>0)

  cout<<a[La+1];

for(i=La;i>=1;i--)

cout<<a[i];

 

 

#include<iostream>

using namespace std;

//高精度加法

string s1,s2;//用两个字符串读入数据,用整形出错

int a[256],b[256];//整形数组 a是把s1中的字符一个个存放在a[]数组中

//a[1]放的s1的个位,a[2]放十位...

//b[1]放的s2的个位,b[2]入十位...

//a[100]放s1的。。。 a[i]=a[i]+b[i];

void read()

{

cin>>s1>>s2;

}

void  add()

{ int i,j,La,Lb;

La=s1.length();

Lb=s2.length();//取两个串的长度

//先把s1倒序放在a[]数组中 ,a[1]放个位

for(i=1;i<=La;i++)

a[i]=s1[La-i]-'0';//-48把s1放在a里面

for(i=1;i<=La;i++)

cout<<a[i]<<" ";

cout<<endl;

//把s2倒序放在b[]数组中

for(i=1;i<=Lb;i++)

b[i]=s2[Lb-i]-'0';

for(i=1;i<=Lb;i++)

cout<<b[i]<<" ";

cout<<endl;

//第2步:避免麻烦,让La最大

if(La<Lb)

{ swap(La,Lb);//!!容易出错

swap(a,b);//交换两个数组

}

//一定是La最大

//第3步:从个位开始到最高位:对应相加

for(i=1;i<=La;i++)

{

a[i]=a[i]+b[i];//对应位相加

if(a[i]>=10)

 { a[i+1]++;// 向i+1进1

  a[i]=a[i]-10;//

 }

}

//第4步:打印:加法可能最高位有进位:La+1

if(a[La+1]>0)

 cout<<a[La+1];

//从高位向个位打

for(i=La;i>=1;i--)

cout<<a[i];

cout<<endl;

}

int main()

{ read();add();

return 0;

}

0
王梓澳
王梓澳
中级光能
中级光能

主体部分:

    cin>>al>>bl;
    int lena = al.length();
    int lenb = bl.length();
    for(int i = 0;i <= lena - 1;i ++)
    a[lena - i] = al[i] - 48;
    for(int i = 0;i <= lenb -1;i ++)
    b[lenb - i] = bl[i] - 48;
    int lenc = 1;
    int x = 0;
    while(lenc <= lena||lenc <= lenb)
    {
        c[lenc] = a[lenc] + b[lenc] + x;
        x = c[lenc] / 10;
        c[lenc] %= 10;
        lenc ++;
    }
    while(lenc > 1&&c[lenc] == 0)
    lenc --;
    for(int i = lenc;i >= 1;i --)
    cout<<c[i];
    cout<<endl;

头文件:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

注意:数组要大点,不然不是满分!

0
黄俊博
黄俊博
资深光能
资深光能

老铁,书上是有的,你怎么又问一遍啊

0
我要回答