vector、string实现大数加法乘法
理解 vector 是一个容器,是一个数据集,里边装了很多个元素。与数组最大的不同是 vector 可以动态增长。
用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将字串的每一个字符 s[i] 以 int 形式赋给 vector<int> a 中的每一个元素。然后将 a[i] 和 a[j] 加起来(或者乘起来)。每两个元素加起来的结果 <= 18,乘起来的结果 <= 81。
用 string 实现大数加法的方法跟 vector 差不多,但是用 string 做大数乘法就有点麻烦,我写了一会儿没写出来。
1. 用 vector 实现大数加法:
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib> //#define min(a,b) ((a>b)?(b):(a))
//#define max(a,b) ((a>b)?(a):(b))
using namespace std; void bigSum(vector<int> &a, vector<int> &b, vector<int> &sum)
{
int i, j, k, tmp;
if( a.size() < b.size() )
{
vector<int> vectmp=a;
a=b;
b=vectmp;
} sum.assign(a.size(), );
for (i=a.size()-, j=b.size()-; i>=; --i)
{
if(j>=)
{
sum[i]=a[i]+b[j];
j--;
}
else sum[i]=a[i];
} for (k = sum.size() - ; k >= ; --k)
{
if (sum[k] > )
{
sum[k]-=;
if(k!=) sum[k-]++;
else sum.insert(sum.begin(), );
}
}
} int main()
{
string x,y;
//freopen("in.txt","r",stdin);
while(cin>>x>>y)
{
vector<int> a,b,c;
for(int i=; i<x.length(); ++i)
a.push_back(x[i]-'');
for(int i=; i<y.length(); ++i)
b.push_back(y[i]-''); bigSum(a,b,c);
for(int i=; i<c.size(); ++i)
cout<<c[i];
cout<<endl<<endl;
}
return ;
}
运行:

2. string 实现大数加法:
//this algorithm is from "oj-killer" of code.google.com
#include <iostream>
#include <cstdlib> //freopen
#include <string> //string using namespace std;
string Sum(string a,string b)
{
if(a.length()<b.length())
{
string temp=a; a=b; b=temp;
}
int i,j;
for(i=a.length()-,j=b.length()-;i>=;i--,j--)
{
a[i]=(a[i]+(j>=?b[j]-'':));
if(a[i]>'')
{
a[i] -=;
if(i) a[i-]++;
else a=''+a;
}
}
return a;
}
int main()
{
string s1,s2;
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(cin>>s1>>s2)
{
cout<<"s1:\t"<<s1<<endl<<"s2:\t"<<s2<<endl;
cout<<"Sum:\t"<<Sum(s1,s2)<<endl<<endl;
}
return ;
}
运行:

3. vector 实现大数乘法:
输入:n
输出:2^(n+1)-1
该算法来自:http://hi.baidu.com/hehui1500/item/6711a09f18590fd91e4271fc
#include <iostream>
#include <vector>
#include <string>
using namespace std; void multiply(const vector<int> &a, const vector<int> &b, vector<int> &result); int main(void)
{
int i, j, n;
while(cin >> n)
{
vector<int> a, b, c; a.push_back();
b.push_back(); for(i = ; i <= n; ++i)
{
c.assign(a.size() + b.size() - , );
multiply(a, b, c);
a = c;
} for (i = ; i < a.size() - ; ++i)
cout << a[i];
cout << c[a.size() - ] - ;
cout << endl;
}
return ;
} void multiply(const vector<int> &a, const vector<int> &b, vector<int> &result)
{
int i, j, k;
int tmp; for (i = ; i < a.size(); ++i)
{
k = i;
for (j = ; j < b.size(); ++j)
result[k++] += a[i] * b[j];
} for (k = result.size() - ; k >= ; --k)
{
if (result[k] > )
{
if (k != )
{ result[k - ] += result[k] / ;
result[k] %= ;
}
else
{
tmp = result[k] / ;
result[k] %= ;
result.insert(result.begin(), tmp);
}
}
}
}
运行:

vector、string实现大数加法乘法的更多相关文章
- sdut2613(This is an A+B Problem)大数加法(乘法)
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>u ...
- [acm 1001] c++ 大数加法 乘法 幂
北大的ACM 1001 poj.org/problem?id=1001 代码纯手动编写 - - #include <iostream> #include <cstdio> #i ...
- java实现大数加法、乘法(BigDecimal)
之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...
- HDU1002大数加法
大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...
- Hat's Fibonacci(大数加法+直接暴力)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 hdu1250: Hat's Fibonacci Time Limit: 2000/1000 M ...
- PAT 甲级 1065. A+B and C (64bit) (20) 【大数加法】
题目链接 https://www.patest.cn/contests/pat-a-practise/1065 思路 因为 a 和 b 都是 在 long long 范围内的 但是 a + b 可能会 ...
- poj3535 A+B (大数加法)
A+B Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 811 Accepted: 371 Description The ...
- 大数高精度加减乘除 51nod 1005 大数加法
1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...
- 51nod 1005 大数加法
#include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...
随机推荐
- Linux C 程序 信号及信号的处理(19)
信号及信号的处理 1.Linux信号的介绍 信号是一种软件中断.Linux系统中根据POSIX标准扩展的信号机制. 1.信号来源 1.硬件方式 1.当用户按下某个键, ...
- c#多层嵌套Json
Newtonsoft.Json.Net20.dll 下载请访问http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提 ...
- [大牛翻译系列]Hadoop(11)MapReduce 性能调优:诊断一般性能瓶颈
6.2.4 任务一般性能问题 这部分将介绍那些对map和reduce任务都有影响的性能问题. 技术37 作业竞争和调度器限制 即便map任务和reduce任务都进行了调优,但整个作业仍然会因为环境原因 ...
- Yii2框架数据库增删改查小结
User::find()->all(); //返回所有用户数据:User::findOne($id); //返回 主键 id=1 的一条数据: User::find()->wh ...
- CLR via C# 序列化读书笔记
1. 序列化格式类 a. 二进制BinaryFormatter b. XML流 NetDataContractSerializer c. CLR类据类型与非CLR数据类型之间互操作 XmlSerial ...
- dotNet中初始化器的使用
dotNet中初始化器的使用 2013年12月7日 13:27 有两类初始化器: 对象初始化器和集合初始化器 比如现在有一个User类: Public class User { public in ...
- .NET开发作业调度(job scheduling) - Quartz.NET
Quartz.NET是JAVA Job Scheduling框架Quartz在.NET平台上的实现,可以满足小型乃至大型企业应用中的Job Scheduling. 通过Nuget安装Quartz.NE ...
- [转]TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 http://blog.163.com/jianlizhao%40126/blog/static/1732511632013410101827640/ U ...
- ASP.NET Web – 输入的有效性验证
下面这个示例显示了与文本框textFirstname相关的验证控件RequiredFieldValidator.所有的验证控件都有ErrorMessage和ControlToValidate属性.如果 ...
- duilib中各控件响应的消息类型
消息 说明 Sender click 鼠标点击 CButtonUI dropdown 下拉显示 CComboUI headerclick 点击列标题 CListHeaderItemUI itemact ...