/* 优点:
1 支持负整数的运算
2 良好的输出形式 没有前导零
3 支持cin直接输入 支持cout直接输出
4 支持整数的直接赋值 big_int x=100;
缺点:
1 封装不好 基本都是友元函数操作
2 速度慢 乘法没有使用FFT 除法采用二分法
使用STL string储存数据也造成速度不是很快
3 待解决的问题 不能直接输出 cout<<a-b
*/ #include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
void change (string &s) {
string tmp="";
int i;
for (i=;i<s.size();i++)
if (s[i]!='')
break;
if (i==s.size()) s="";
else {
for (;i<s.size();i++)
tmp+=s[i];
s=tmp;
}
}
class big_int
{
private :
bool flag;
string s;
public :
big_int (){ flag=; s=""; }
big_int (int x);
bool operator ==(const big_int& x) {
string tmp=x.s;
change (s);
change (tmp);
if (x.s==""&&s=="") return true;
return x.flag==flag&&s==tmp;
}
friend big_int operator+(const big_int& a, const big_int& b );
friend big_int operator-(const big_int& a, const big_int& b );
friend big_int operator*(const big_int& a, const big_int& b);
friend big_int operator/(const big_int& a, const big_int& b);
friend big_int operator%(const big_int& a, const big_int& b);
friend ostream& operator<<(ostream& out,big_int& x) {
if (!x.flag&&x.s!="") cout<<"-";
change (x.s);
cout<<x.s;
return out;
}
friend istream& operator>>(istream& in,big_int& x) {
string tmp;
cin>>tmp;
if (tmp[]=='-') {
x.flag=;
x.s=tmp.substr(,tmp.size()-);
}
else {
x.flag=;
x.s=tmp;
}
return in;
}
};
big_int:: big_int (int x) {
if (x<) flag=;
else flag=;
x=abs(x); s=""; string tmp="";
if (x==) s+=tmp;
while (x!=) {
tmp[]=''+x%;
s+=tmp;
x/=;
}
reverse(s.begin(),s.end());
}
string add(string s1,string s2) {
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
int len =max (s1.size(),s2.size());
int k=; int t1,t2;
string ans=""; string tmp="";
for (int i=;i<len;i++) {
t1=t2=;
if (i<s1.size()) t1=s1[i]-'';
if (i<s2.size()) t2=s2[i]-'';
int t=t1+t2+k;
tmp[]=''+t%; k=t/;
ans+=tmp;
}
if (k!=) {
tmp[]=''+k;
ans+=tmp;
}
reverse(ans.begin(),ans.end());
return ans;
}
string sub (string s1,string s2) {
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
int len =s1.size();
int t1,t2;
string ans=""; string tmp="";
for (int i=;i<len;i++) {
t1=s1[i]-''; t2=;
if (i<s2.size()) t2=s2[i]-'';
if (t1<t2) {
for (int j=i+;j<len;j++)
if (s1[j]-''==) s1[j]='';
else {
s1[j]--;
break;
}
t1+=;
}
tmp[]=t1-t2+'';
ans+=tmp;
}
reverse(ans.begin(),ans.end());
change(ans);
return ans;
}
bool m_cmp (string s1, string s2) {
change (s1);
change (s2);
if (s1.size()==s2.size()) {
for (int i=;i<s1.size();i++)
if (s1[i]!=s2[i])
return s1[i]>s2[i];
}
return s1.size()>s2.size();
}
string s_mul (string s,int x,int k) {
string ans=""; string tmp="";
for (int i=;i<=k;i++) ans+=tmp;
k=;
for (int i=;i<s.size();i++) {
int t=s[i]-'';
int p=t*x+k;
tmp[]=''+p%; ans+=tmp;
k=p/;
}
if (k) {
tmp[]=''+k;
ans+=tmp;
}
reverse(ans.begin(),ans.end());
change(ans);
return ans;
}
string mul (string s1,string s2) {
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
string ans="";
for (int i=;i<s2.size();i++) {
int x=s2[i]-'';
string tmp=s_mul (s1,x,i);
ans=add(ans,tmp);
//cout<<ans<<endl;
}
return ans;
}
big_int operator+(const big_int& a, const big_int& b ) {
big_int c;
int t=a.flag^b.flag;
if (t==) {
c.s=add (a.s,b.s);
c.flag=a.flag;
}
else {
if (m_cmp(a.s,b.s)) {
c.flag=a.flag;
c.s=sub (a.s,b.s);
}
else {
c.flag=b.flag;
c.s=sub (b.s,a.s);
}
}
return c;
}
big_int operator-(const big_int& a, const big_int& b ) {
big_int c=b;
c.flag=!b.flag;
return a+c;
}
big_int operator*(const big_int& a, const big_int& b) {
big_int c;
int t=a.flag^b.flag;
if (t) c.flag=;
if (m_cmp(a.s,b.s)) c.s=mul (a.s,b.s);
else c.s=mul (b.s,a.s);
return c;
}
big_int operator/(const big_int& a, const big_int& b) {
if (b.s=="") {
cout<<"error"<<endl;
exit(-);
}
big_int c;
big_int _a=a, _b=b;
_a.flag=_b.flag=;
if (m_cmp(_b.s,_a.s)) return c; stack <big_int> q;
big_int k=;
while () {
big_int x=k*_b; q.push(k);
if (m_cmp(x.s,_a.s))
break;
k=k*;
}
big_int tmp=_a;
while (tmp.s!=""&&!q.empty()) {
k=q.top(); q.pop();
big_int x=k*_b;
if ( !m_cmp(x.s,tmp.s)) {
tmp=tmp-x;
c=c+k;
}
}
if (a.flag^b.flag) c.flag=;
return c;
}
big_int operator%(const big_int& a, const big_int& b) {
big_int c=a/b;
c=c*b;
c=a-c;
return c;
}
int main ()
{
big_int a,b;
big_int c=-;
cout<<c<<endl;
while (cin>>a>>b) {
c=a+;
cout<<c<<" ";
c=a-b;
cout<<c<<" ";
c=a*b;
cout<<c<<" ";
c=a/b;
cout<<c<<" ";
c=a%b;
cout<<c<<endl;
}
return ;
}

大整数四则运算------(c++ 实现 乘法没有用傅里叶变换)的更多相关文章

  1. 大整数四则运算(vector与数组两种版本实现)

    每逢大整数四则运算,都会怯懦,虽是算法竞赛必会的东西,也零散的学过,简单的总结过,但不成体系的东西心里一直没底. 所以今天消耗了大量的卡路里,啃了几套模板之后终于总结成了一套自己的模板 再也不用担心大 ...

  2. 大整数算法[09] Comba乘法(原理)

    ★ 引子          原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...

  3. Code Kata:大整数四则运算—乘法 javascript实现

    上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...

  4. 大整数算法[11] Karatsuba乘法

    ★ 引子         前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...

  5. [转]大整数算法[11] Karatsuba乘法

    ★ 引子         前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...

  6. Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现

    大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...

  7. Code Kata:大整数四则运算—除法 javascript实现

    除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...

  8. 大整数算法[10] Comba乘法(实现)

    ★ 引子 上一篇文章讲了 Comba 乘法的原理,这次来讲讲如何实现.为了方便移植和充分发挥不同平台下的性能,暂时用了三种不同的实现方式: 1.单双精度变量都有的情况. 2.只有单精度变量的情况. 3 ...

  9. C语言课程设计大整数运算

    该大整数运算系统用于对有符号的位数不超过500位的大整数进行加.减.乘.除四则运算和计算N(0<=N<=10000)的阶乘.注意事项 :    1.操作期间,进行四则运算时若大整数为正数请 ...

随机推荐

  1. Ubuntu 下matlab 查看memory函数

    %Copyright (c) 2012, Michael Hirsch%All rights reserved.%%Redistribution and use in source and binar ...

  2. redux源码解析(深度解析redux+异步demo)

    redux源码解析 1.首先让我们看看都有哪些内容 2.让我们看看redux的流程图 Store:一个库,保存数据的地方,整个项目只有一个 创建store Redux提供 creatStore 函数来 ...

  3. oracle sqlserver mysql 通过sql查看表及字段注释

    oracle: SELECT A.TABLE_NAME,A.COMMENTS,B.COLUMN_NAME,B.COMMENTS FROM USER_TAB_COMMENTS A,USER_COL_CO ...

  4. 数据库-->记录操作

    一.概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...

  5. Spring boot 导出Excel

    Html页面: window.location.href="adjectfkController/exportTemplate?adjOrg="+ adjOrg +"&a ...

  6. Android开发 ---如何操作资源目录中的资源文件5 ---Raw资源管理与国际化

    效果图: 1.activity_main.xml 描述: 定义两个按钮,一个是Raw资源管理,一个是处理国际化语言,其中i18n表示简体中文 <?xml version="1.0&qu ...

  7. Map的isEmpty()与==null的区别

    isEmpty()方法判断Map是否有内容(即new分配空间后是否put键值对),若没有内容则true,否则false == null是判断map是否为null(即是否new分配空间,和其中的键值对没 ...

  8. java websocket学习

    引言: websocket,webservice傻傻分不清楚,都觉得是很高深的东西,理解中的webservice是一种协议,通信协议,类似http协议的那种,比如使用webservice协议调后台接口 ...

  9. 8.Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  10. Linux 配置selenium + webdriver 环境

    1.ubuntu 自带了python, 可以打开终端输入python 回车后如果显示版本信息就说明已经安装 2.安装安装python setup tools apt-get install pytho ...