理解 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实现大数加法乘法的更多相关文章

  1. sdut2613(This is an A+B Problem)大数加法(乘法)

    #include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>u ...

  2. [acm 1001] c++ 大数加法 乘法 幂

    北大的ACM 1001 poj.org/problem?id=1001 代码纯手动编写 - - #include <iostream> #include <cstdio> #i ...

  3. java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  4. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  5. Hat's Fibonacci(大数加法+直接暴力)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 hdu1250: Hat's Fibonacci Time Limit: 2000/1000 M ...

  6. PAT 甲级 1065. A+B and C (64bit) (20) 【大数加法】

    题目链接 https://www.patest.cn/contests/pat-a-practise/1065 思路 因为 a 和 b 都是 在 long long 范围内的 但是 a + b 可能会 ...

  7. poj3535 A+B (大数加法)

    A+B Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 811   Accepted: 371 Description The ...

  8. 大数高精度加减乘除 51nod 1005 大数加法

    1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...

  9. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

随机推荐

  1. 可以支持jQuery1.10.1 的 fancybox 1.3.4, 並現在type為Ajax時,也可以定義窗口的大小。

    官網上的 fancybox 1.3.4 太老了,不支持jQuery1.10.1,改動了一下源碼,現在可以支持了. type為Ajax時,也可以定義窗口的大小. $("#ajaxlink&qu ...

  2. aspx利用cookie值来停止silverlight中的计时器

    一.silverlight与silverlight中可以利用委托(delegate)来刷新frame.Refresh() 1.在子类中定义委托捕捉关闭事件按钮 public delegate void ...

  3. Ubuntu16.04.1 安装Redis-Cluster

    Redis在3.0版正式引入了集群这个特性.Redis集群是一个分布式(distributed).容错(fault-tolerant)的 Redis内存K/V服务, 集群可以使用的功能是普通单机 Re ...

  4. php读取excel日期类型数据的例子

    提供一个读取的函数:  代码如下 复制代码 //excel日期转换函数function excelTime($date, $time = false) { if(function_exists('Gr ...

  5. 删除mysql的root用户恢复方法

    1.# service mysqld stop                             #停止mysql数据库服务Shutting down MySQL.. SUCCESS! 2.# ...

  6. ios里的UIActionSheet的使用

    class ViewController: UIViewController,UIActionSheetDelegate{ @IBOutlet weak var label1: UILabel! @I ...

  7. 一个Java对象到底占用多大内存

    在网上搜到了一篇博客讲的非常好,里面提供的这个类也非常实用: import java.lang.instrument.Instrumentation; import java.lang.reflect ...

  8. virtualbox usb连接问题解决

    生命在于折腾... 神奇的liinux... ubuntu 14.04 LTS sudo apt-get install virtualbox -y 然后建好虚拟机之后(windows也好,linux ...

  9. C#如何判断两个数组相等

    /// <summary> /// 数组比较是否相等 /// </summary> /// <param name="bt1">数组1</ ...

  10. Careercup - Google面试题 - 4557716425015296

    2014-05-03 21:57 题目链接 原题: Many sticks with length, every time combine two, the cost is the sum of tw ...