初级光能
#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;
}
怎么做???
新手守护
高精度加法:先把字符数组转换成数字相加 ,如果有进位,本位减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;
}
中级光能
主体部分:
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>
注意:数组要大点,不然不是满分!