A+B长整数的加法(算法实现)
2010-10-13 15:46
274 查看
问题:计算长度100位以内的 20进制的加法
分析:用字符串存储 A,B 再两位两位的做加法运算,注意进位怎么处理。
源码:
Code:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
/*
*author : husiwen
*function : 计算长度100位以内的 20进制的加法
*Program idea:
*(1)先把加数和被加数反转,再从第0位开始
*(2)到末尾两位依次相加;
*(3)每两位的结果放置于一向量表中,
*(4)待全部完成后,逆序输出;
*/
using namespace std;
int main(int argc,char * argv[])
{
//ifstream cin("aaa.txt");
string sa,sb,t;
vector<int> v;
int i;
int a,b,sum;
int flag;
while (cin>>sa>>sb)
{
flag = 0; //没有进位
v.clear(); // 清空结果向量
sum = 0; //置结果为0
//反转两个字符串
reverse(sa.begin(),sa.end());
reverse(sb.begin(),sb.end());
if(sa.size()<sb.size())//sa中放长字符,sb中放短字符;
{
t=sa;
sa=sb;//交换算法:再常用不过了。
sb=t;
}
for(i=0;i<sa.size();i++)
{
//20进制的表示 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19;
// 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j
if (sa[i]=='0') a=0;
else if(sa[i]=='1') a=1;
else if(sa[i]=='2') a=2;
else if(sa[i]=='3') a=3;
else if(sa[i]=='4') a=4;
else if(sa[i]=='5') a=5;
else if(sa[i]=='6') a=6;
else if(sa[i]=='7') a=7;
else if(sa[i]=='8') a=8;
else if(sa[i]=='9') a=9;
else if(sa[i]=='a') a=10;
else if(sa[i]=='b') a=11;
else if(sa[i]=='c') a=12;
else if(sa[i]=='d') a=13;
else if(sa[i]=='e') a=14;
else if(sa[i]=='f') a=15;
else if(sa[i]=='g') a=16;
else if(sa[i]=='h') a=17;
else if(sa[i]=='i') a=18;
else if(sa[i]=='j') a=19;
if(i>sb.size()) b=0;
else
{
if (sb[i]=='0') b=0;
else if(sb[i]=='1') b=1;
else if(sb[i]=='2') b=2;
else if(sb[i]=='3') b=3;
else if(sb[i]=='4') b=4;
else if(sb[i]=='5') b=5;
else if(sb[i]=='6') b=6;
else if(sb[i]=='7') b=7;
else if(sb[i]=='8') b=8;
else if(sb[i]=='9') b=9;
else if(sb[i]=='a') b=10;
else if(sb[i]=='b') b=11;
else if(sb[i]=='c') b=12;
else if(sb[i]=='d') b=13;
else if(sb[i]=='e') b=14;
else if(sb[i]=='f') b=15;
else if(sb[i]=='g') b=16;
else if(sb[i]=='h') b=17;
else if(sb[i]=='i') b=18;
else if(sb[i]=='j') b=19;
}
sum = a+b+flag ;
if(sum>19)
{
flag = 1; //进位
sum =sum -20; //保留位
}
else
{
flag = 0;
}
v.push_back(sum);//保存保留位
//每两位的数值相加后进入向量v中;
}
if (flag == 1) v.push_back(1);
//输出结果
for(i =v.size()-1; i>=0 ; i--)
{
if(v[i]<10) cout<<v[i];
//判断输出
else if(v[i]==10) cout<<"a";
else if(v[i]==11) cout<<"b";
else if(v[i]==12) cout<<"c";
else if(v[i]==13) cout<<"d";
else if(v[i]==14) cout<<"e";
else if(v[i]==15) cout<<"f";
else if(v[i]==16) cout<<"g";
else if(v[i]==17) cout<<"h";
else if(v[i]==18) cout<<"i";
else if(v[i]==19) cout<<"j";
}
cout<<endl;
}
return 0;
}
测试结果:
Code:
12355669998779
12335340084958204
124476956edieg97d
12354892134095873405acb
abc
1235489213409587340g143
分析:用字符串存储 A,B 再两位两位的做加法运算,注意进位怎么处理。
源码:
Code:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
/*
*author : husiwen
*function : 计算长度100位以内的 20进制的加法
*Program idea:
*(1)先把加数和被加数反转,再从第0位开始
*(2)到末尾两位依次相加;
*(3)每两位的结果放置于一向量表中,
*(4)待全部完成后,逆序输出;
*/
using namespace std;
int main(int argc,char * argv[])
{
//ifstream cin("aaa.txt");
string sa,sb,t;
vector<int> v;
int i;
int a,b,sum;
int flag;
while (cin>>sa>>sb)
{
flag = 0; //没有进位
v.clear(); // 清空结果向量
sum = 0; //置结果为0
//反转两个字符串
reverse(sa.begin(),sa.end());
reverse(sb.begin(),sb.end());
if(sa.size()<sb.size())//sa中放长字符,sb中放短字符;
{
t=sa;
sa=sb;//交换算法:再常用不过了。
sb=t;
}
for(i=0;i<sa.size();i++)
{
//20进制的表示 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19;
// 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j
if (sa[i]=='0') a=0;
else if(sa[i]=='1') a=1;
else if(sa[i]=='2') a=2;
else if(sa[i]=='3') a=3;
else if(sa[i]=='4') a=4;
else if(sa[i]=='5') a=5;
else if(sa[i]=='6') a=6;
else if(sa[i]=='7') a=7;
else if(sa[i]=='8') a=8;
else if(sa[i]=='9') a=9;
else if(sa[i]=='a') a=10;
else if(sa[i]=='b') a=11;
else if(sa[i]=='c') a=12;
else if(sa[i]=='d') a=13;
else if(sa[i]=='e') a=14;
else if(sa[i]=='f') a=15;
else if(sa[i]=='g') a=16;
else if(sa[i]=='h') a=17;
else if(sa[i]=='i') a=18;
else if(sa[i]=='j') a=19;
if(i>sb.size()) b=0;
else
{
if (sb[i]=='0') b=0;
else if(sb[i]=='1') b=1;
else if(sb[i]=='2') b=2;
else if(sb[i]=='3') b=3;
else if(sb[i]=='4') b=4;
else if(sb[i]=='5') b=5;
else if(sb[i]=='6') b=6;
else if(sb[i]=='7') b=7;
else if(sb[i]=='8') b=8;
else if(sb[i]=='9') b=9;
else if(sb[i]=='a') b=10;
else if(sb[i]=='b') b=11;
else if(sb[i]=='c') b=12;
else if(sb[i]=='d') b=13;
else if(sb[i]=='e') b=14;
else if(sb[i]=='f') b=15;
else if(sb[i]=='g') b=16;
else if(sb[i]=='h') b=17;
else if(sb[i]=='i') b=18;
else if(sb[i]=='j') b=19;
}
sum = a+b+flag ;
if(sum>19)
{
flag = 1; //进位
sum =sum -20; //保留位
}
else
{
flag = 0;
}
v.push_back(sum);//保存保留位
//每两位的数值相加后进入向量v中;
}
if (flag == 1) v.push_back(1);
//输出结果
for(i =v.size()-1; i>=0 ; i--)
{
if(v[i]<10) cout<<v[i];
//判断输出
else if(v[i]==10) cout<<"a";
else if(v[i]==11) cout<<"b";
else if(v[i]==12) cout<<"c";
else if(v[i]==13) cout<<"d";
else if(v[i]==14) cout<<"e";
else if(v[i]==15) cout<<"f";
else if(v[i]==16) cout<<"g";
else if(v[i]==17) cout<<"h";
else if(v[i]==18) cout<<"i";
else if(v[i]==19) cout<<"j";
}
cout<<endl;
}
return 0;
}
测试结果:
Code:
12355669998779
12335340084958204
124476956edieg97d
12354892134095873405acb
abc
1235489213409587340g143
相关文章推荐
- A+B长整数的加法(算法实现)
- 大整数加法计算思路与算法实现
- A+B长整数的加法(算法实现)
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 算法设计与分析 整数划分的递归实现算法
- 算法:求从1到n这n个整数的十进制表示中1出现的次数-- python 实现
- 超长整数的基础运算 算法实现之模、模幂篇
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 数据结构 P42-43 算法实现 多项式的建立及加法
- 用位运算实现两个整数的加法运算
- VC++ 利用位运算实现两个整数的加法运算
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- php实现大整数加法
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- 写一个算法实现在一个整数数组中,找出第二大的那个数字。
- 算法总结——大整数加法
- 实现任意两个整数的加法
- [CodeWars][JS]实现大整数加法
- 经典笔试题:从十亿个整数中选择前100大整数的算法实现