理解 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. vim包,已自带所有常用插件及常用命令总结

    /** ****************************************************************************** * @author    Maox ...

  2. 另辟思路解决 Android 4.0.4 不能监听Home键的问题

    问题描述: 自从Android 4.0以后,开发人员是不能监听和屏蔽Home键的,对于KEYCODE_HOME,官方给出的描述如下: Home key. This key is handled by ...

  3. nginx服务器配置多域名

    nginx服务器支持配置多站点,我们可以通过配置子域名让你的一个域名下放置多个项目. 那么如何实现这个过程呢? 网络上的许多方案,有些写的过于繁杂,有些则是配置有误,或者说,有些配置项是要根据自己的主 ...

  4. Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址

    内容全部是自己手工原创写作的参考内容,完全排除从其他网站COPY的内容信息.如有雷同实属巧合.   奉献给有需求的人士,也给各位解决FLASH安装头疼的问题,正常在线下载安装运气不好的安装半天.运气好 ...

  5. JAVA面试题集之基础知识

                           JAVA面试题集之基础知识 基础知识:  1.C 或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就 ...

  6. Eclipse 下 opennms 开发环境搭建

    1.eclipse3.5或更高版本,并且使用纯净的java版.下载地址:Eclipse for Java Developers. 2.安装需要的插件.通过Help/Install New Softwa ...

  7. 帝国cms后台不停的登录成功

    http://bbs.phome.net/showthread-13-305985-1.html 感谢各位的支持与帮助! e/data/adminlogin目录权限没有问题 问题在:计划任务中,刷新自 ...

  8. ADO.NET- 基础总结及实例介绍

    最近闲暇时间写的一些小程序中,访问数据库比较多:下面主要介绍下ADO.NET方面知识,有不足之处,希望大神们不吝赐教: 提到ADO.NET,经常会和ASP.NET进行混淆,两者的区别很大,没有可比性, ...

  9. angular入门系列教程2

    主题: 本篇主要介绍下angular里的一些概念,并且在咱们的小应用上加上点料.. 概念(大概了解即可,代码中遇到的会有详细注释): 模板:动态模板,是动态的,直接去处理DOM的,而不是通过处理字符串 ...

  10. myeclipse/eclipse添加Spket插件实现ExtJs4.2/ExtJs3智能提示

    前言 感谢luotao,本博客是copy这篇博客的:http://www.cnblogs.com/luotaoyeah/p/3803926.html ,因为太重要了,所以笔者再写一次. 重要说明:ec ...