大整数四则运算------(c++ 实现 乘法没有用傅里叶变换)
/* 优点:
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++ 实现 乘法没有用傅里叶变换)的更多相关文章
- 大整数四则运算(vector与数组两种版本实现)
每逢大整数四则运算,都会怯懦,虽是算法竞赛必会的东西,也零散的学过,简单的总结过,但不成体系的东西心里一直没底. 所以今天消耗了大量的卡路里,啃了几套模板之后终于总结成了一套自己的模板 再也不用担心大 ...
- 大整数算法[09] Comba乘法(原理)
★ 引子 原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...
- Code Kata:大整数四则运算—乘法 javascript实现
上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...
- 大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- [转]大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现
大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...
- Code Kata:大整数四则运算—除法 javascript实现
除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...
- 大整数算法[10] Comba乘法(实现)
★ 引子 上一篇文章讲了 Comba 乘法的原理,这次来讲讲如何实现.为了方便移植和充分发挥不同平台下的性能,暂时用了三种不同的实现方式: 1.单双精度变量都有的情况. 2.只有单精度变量的情况. 3 ...
- C语言课程设计大整数运算
该大整数运算系统用于对有符号的位数不超过500位的大整数进行加.减.乘.除四则运算和计算N(0<=N<=10000)的阶乘.注意事项 : 1.操作期间,进行四则运算时若大整数为正数请 ...
随机推荐
- [转]关于ReentrantLock中线程读某个变量是否需要加锁
我在使用ReentrantLock类对变量进行多线程累加时,调用了lock()和unlock()方法,但读取该变量时我未加锁,结果是能正确执行,代码如下: public class Main { pr ...
- Vm install centos7
- Linux gcc getcwd()的实现 zhuan
通过getcwd()可以获取当前工作目录. 1 #include <unistd.h> 2 3 char *getcwd(char *cwdbuf, size_t size);
- linux的典型分支:
1.redhat 2.debian 3.centOS 4.ubuntu 5.fedora 6.kali linux
- laravel模型表建立外键约束的使用:
模型: //表->posts class Post extends Model { //关联用户: public function user(){ //belongsTo,第一个参数:外键表,第 ...
- Java 实现倒计时(由秒计算天、小时、分钟、秒)
public class Countdown4 { private static long day = 0; private static long hour = 0; private static ...
- 获取音、视频时长(NAudio,Shell32,FFmpeg)
参考网址:https://blog.csdn.net/u013810234/article/details/57471780 以下为本次测试用到的音.视频格式: audio :”.wav;.mp3;. ...
- day038 navicat pymysql
今日内容: 1.navicat 2.pymysql 1.navicat 需要掌握 #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表:外键 #5. 新建查询 ...
- Java 几种showMessageDialog的表示
最近在做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法. 很方便的,于是就简单的整理了一下. 1.1 showMessageDialog 显示一个带有OK 按钮的模 ...
- 泛型算法,排序的相关操作,lower_bound、upper_bound、equal_range
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...