首页 > 其他分享 >大整数 Bignumber

大整数 Bignumber

时间:2023-05-27 22:11:06浏览次数:50  
标签:Bignumber int big number 整数 postive ans size

#include <bits/stdc++.h>
using namespace std;

struct big_number {
  bool is_postive;
  string s;
  big_number () {}
  big_number (string ss) { if (ss[0] != '-') {this->s = ss; this->is_postive = true;} else {this->s = ss.substr(1, ss.size()); this->is_postive = false;}}
  big_number (string ss, bool flag) {this->s = ss; this->is_postive = flag; }
  void print() {if (is_postive == false) cout << "-"; cout << s;}
  void println() {if (is_postive == false) cout << "-"; cout << s << "\n";}
  int size() { return int(s.size()); }
  bool operator < (const big_number &b) const {
    if (int(s.size()) != int(b.s.size())) return int(s.size()) < int(b.s.size());
    return s < b.s;
  }
  bool operator > (const big_number &b) const {
    if (int(s.size()) != int(b.s.size())) return int(s.size()) > int(b.s.size());
    return s > b.s;
  }
  bool operator == (const big_number &b) const {
    return s == b.s;
  }
  bool operator != (const big_number &b) const {
    return s != b.s;
  }
  friend inline big_number operator + (const big_number &p, const big_number &q) {
    if (p.is_postive != q.is_postive) {
      if (p.is_postive == false) {big_number np(p.s, true), nq(q.s, true); return nq - np;}
      else {big_number np(p.s, true), nq(q.s, true); return np - nq;}
    } 
    string a = p.s, b = q.s;
    reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); 
    if (int(a.size()) < int(b.size())) swap(a, b); // len(a) > len(b)
    int t = 0; big_number ans;
    for (int i = 0; i < int(a.size()); i ++ ) {
      if (i < int(a.size())) t += (a[i] - '0');
      if (i < int(b.size())) t += (b[i] - '0');
      ans.s += char('0' + (t % 10)); t /= 10;
    }
    if (t) ans.s += char('0' + (t % 10));
    reverse(ans.s.begin(), ans.s.end());
    if (p.is_postive == false and q.is_postive == false) ans.is_postive = false;
    else ans.is_postive = true;
    return ans;
  }

  friend inline big_number operator - (const big_number &p, const big_number &q) {
    if (p.is_postive != q.is_postive) {
      if (p.is_postive == false) {big_number np(p.s, false), nq(q.s, false); return nq + np;}
      else {big_number np(p.s, true), nq(q.s, true); return np + nq;}
    } else {
      if (p.is_postive == false) {big_number np(p.s, true), nq(q.s, true); return nq - np;}
    }
    string a = p.s, b = q.s;
    if (a == b) return big_number("0");
    reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); 
    // bool postive = true;
    int t = 0; big_number ans;
    if (p < q) {swap(a, b); ans.is_postive = false; } // len(a) > len(b)
    for (int i = 0; i < int(a.size()); i ++ ) {
      if (i < int(a.size())) t += (a[i] - '0');
      if (i < int(b.size())) t -= (b[i] - '0');
      ans.s += char('0' + ((t + 10) % 10)); 
      t = t < 0 ? -1 : 0;
    }
    assert(t == 0);
    while (not ans.s.empty() and ans.s.back() == '0') ans.s.pop_back();
    reverse(ans.s.begin(), ans.s.end());
    return ans;
  }

  string MUL (string a, int b, int cnt) const {
    string B = a, ans; int n = B.size();
    int t = 0; reverse(B.begin(), B.end());
    if (cnt) ans += string(cnt, '0');
    for (int i = 0; i < n; i ++ ) {
      t += b * int(B[i] - '0');
      ans += char('0' + (t % 10));
      t /= 10;
    }
    while (t) {ans += char('0' + (t % 10)); t /= 10; }
    reverse(ans.begin(), ans.end());
    return ans;
  }

  friend inline big_number operator * (const big_number &p, const big_number &q) {
    string a = p.s, b = q.s;
    
    if (int(a.size()) < int(b.size())) swap(a, b); // len(a) > len(b)
    big_number ans("0"), mul(a);
    reverse(b.begin(), b.end());
    for (int i = 0; i < int(b.size()); i ++ ) {
      string now = p.MUL(a, int(b[i] - '0'), i);
      ans = ans + big_number(now);
    }
    if (p.is_postive != q.is_postive) ans.is_postive = false;
    else ans.is_postive = true;
    return ans;
  }
};

int main() {
  // big_number a("1231"), b("234");
  string x, y; cin >> x >> y;
  big_number a(x), b(y), ans;
  ans = a + b; ans.println();
  ans = a - b; ans.println();
  ans = a * b; ans.println();
  ans = b - a; ans.println();
  ans = (b - a) * (a - b); ans.println();

  
  return 0;
}

标签:Bignumber,int,big,number,整数,postive,ans,size
From: https://www.cnblogs.com/c972937/p/17437458.html

相关文章

  • 8. 字符串转换整数 (atoi)
    请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。......
  • 2023-05-25:给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的
    2023-05-25:给定一个正整数x,我们将会写出一个形如x(op1)x(op2)x(op3)x...的表达式其中每个运算符op1,op2,…可以是加、减、乘、除之一例如,对于x=3,我们可以写出表达式3*3/3+3-3,该式的值为3在写这样的表达式时,我们需要遵守下面的惯例:除运算符(/)返回有理数任何地......
  • 2023-05-25:给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的
    2023-05-25:给定一个正整数x,我们将会写出一个形如x(op1)x(op2)x(op3)x...的表达式其中每个运算符op1,op2,…可以是加、减、乘、除之一例如,对于x=3,我们可以写出表达式3*3/3+3-3,该式的值为3在写这样的表达式时,我们需要遵守下面的惯例:除运算符(/)返回有理数......
  • 简单/复杂整数划分
    这个题我做过类似的题目,没错,又是记忆化搜索,但也不完全是,还是用搜索就可以过,本质也是动态规划基本上只要会简单的,就会做复杂的,只不过是步骤麻烦点#include<bits/stdc++.h>usingnamespacestd;intn,a[1000010]={1},res=1;voiddfs(intt,ints)//现在的数总和是t,用......
  • 数据转换-整数字节数组
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1参考《GMT0009-2012SM2密码算法使用规范》第6节“数据转换”在utils.h和utils.c中完成整数与8位字节串的转换功能(10'):intInt2ByteArr(unsignedinti,unsignedchar*ba);intByteArr2Int(unsignedchar*......
  • 数据转换-整数字节数组
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1参考《GMT0009-2012SM2密码算法使用规范》第6节“数据转换”在utils.h和utils.c中完成整数与8位字节串的转换功能(10'):intInt2ByteArr(unsignedinti,unsignedchar*ba);intByteArr2Int(unsignedchar*ba......
  • 2023-05-22:给定一个长度为 n 的字符串 s ,其中 s[i] 是: D 意味着减少; I 意味着增加。
    2023-05-22:给定一个长度为n的字符串s,其中s[i]是:D意味着减少;I意味着增加。有效排列是对有n+1个在[0,n]范围内的整数的一个排列perm,使得对所有的i:如果s[i]=='D',那么perm[i]>perm[i+1],以及;如果s[i]=='I',那么perm[i]<perm[i+1]。返回有效排列......
  • 整数缓冲区
    整数缓冲区java预先创建了256个常用的整数包装类型对象。在实际应用中,对已创建的对象进行重复使用。publicclassDemo02{publicstaticvoidmain(String[]args){Integerinteger1=newInteger(100);Integerinteger2=newInteger(100);......
  • 64位整数乘法
    题目描述求a乘b对p取模的值。输入格式第一行输入整数a,第二行输入整数b,第三行输入整数p。输出格式输出一个整数,表示a*bmodp的值。数据范围1≤a,b,p≤10^18输入样例345输出样例2分析考虑到a,b,p的数据范围都非常大,无法直接先取模再相乘计算,由于可......
  • 5.1 从键盘任意输入一个整数,不使用计算绝对值函数编程计算并输出该实数的绝对值
    设计思路:对正数和负数分情况编程,编程设计程序代码:#include<stdio.h>intmain(){inta;scanf("%d",&a);if(a<=0){a=-a;printf("%d",a);}elseprintf("%d",a);return0;}总结:if判断语句应用。......