高精度大数(超long long)取余原理及模板

简介: 高精度大数(超long long)取余原理及模板

高精度大数取余普通版

大数取余的原理: 从字符串的首位开始,对其取余,并将余数存起来与后一位连接(非相加),继续取余。

其实就是模拟我们手算时的过程

例如 562对3取余
取首位 5 % 3=2
取第二位 并加上之前的余数 (2* 10+6)%3=2
取第三位 同样加上之前的余数 (2*10+2)%3=4
得到 562%3=4


long long ans=0;
for (int i = 0; i < num.size(); i++) {
  ans=(ans*10+num[i]-'0')%mod;//mod是需要取余的数,ans为结果
}

高精度大数取余快速版(局部有序,整体有序)

1

一位一位取对于一些题目来说可能有点慢,那么采用三位,四位取余的方法

char k[105];
  int a[40];
  scanf("%s",k);//输入字符串
  int len=strlen(k)-1;
  int ans=0;
  for(int i=0; i<=len; i=i+3) {
    int cnt=0;
    int ff=0;
    for(int j=0; j<=2; j++) {
      if(i+j>len)
        break;
      cnt=cnt*10+k[i+j]-'0';
      if(ff==0) {
        ans++;
        ff=1;
      }
    }
    a[ans]=cnt;//三位一个存储到数组a
  }

这里采用局部有序,整体有序的方法

int cnt=0,xx=0;
  for(int j=1; j<=ans; j++) {
    if(a[j]<10 &&j==ans)
      xx=10;
    else if(a[j]<100 &&j==ans)
      xx=100;
    else
      xx=1000;
    cnt=(cnt*xx+a[j])%mod;
  }
  cout<<cnt;

发现最后一个a[i]可能是一位数,二位数,三位数,所以模板也要做出修改

2

会发现这样写代码有点繁琐了,能不能做出一点修改使得代码变得更加简洁呢

char k[105];
  int a[40];
  scanf("%s",k);//输入字符串
  int len=strlen(k)-1;
  int ans=0;
  int top=(len+1)%3;
  int cnt1=0;
  for(int i=0;i<top;i++){
    cnt1=cnt1*10+k[i]-'0';
  }
  a[++ans]=cnt1;
  for(int i=top; i<=len; i=i+3) {
    int cnt=0;
    int ff=0;
    for(int j=0; j<=2; j++) {
      if(i+j>len)
        break;
      cnt=cnt*10+k[i+j]-'0';
      if(ff==0) {
        ans++;
        ff=1;
      }
    }
    a[ans]=cnt;//三位一个存储到数组a
  }

int cnt=0,xx=1000;
  for(int j=1; j<=ans; j++) {
    cnt=(cnt*xx+a[j])%mod;
  }
  cout<<cnt;

此时只要更改一下字符串存储到数组a中的方式即可

四位数,五位数同理即可


目录
相关文章
|
23天前
|
JavaScript 前端开发
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
98 0
|
3月前
|
算法
【算法】位运算算法——两整数之和
【算法】位运算算法——两整数之和
|
5月前
|
存储 算法 Python
技术心得记录:大整数算法【10】Comba乘法(实现)
技术心得记录:大整数算法【10】Comba乘法(实现)
27 0
|
6月前
|
语音技术 Python
量化模型是将浮点数运算转换为整数运算的过程
【2月更文挑战第32天】量化模型是将浮点数运算转换为整数运算的过程
64 1
|
6月前
|
存储
leetcode:415. 字符串相加(模拟竖式计算)
leetcode:415. 字符串相加(模拟竖式计算)
61 0
|
6月前
|
算法 前端开发
前端算法-二进制求和
前端算法-二进制求和
|
6月前
牛客网刷题总结1.利用%符号获取特定位数的数字。2.强制类型转换 (将float转换为int )3.计算有关浮点型数据时,要注意你计算过程中所有的数据都是浮点型
牛客网刷题总结1.利用%符号获取特定位数的数字。2.强制类型转换 (将float转换为int )3.计算有关浮点型数据时,要注意你计算过程中所有的数据都是浮点型
64 0
|
存储 C语言
C语言四舍五入计算方法(包含各种精度)
C语言四舍五入计算方法(包含各种精度)
950 0
运用BigInteger进行整数之间的高精度的加减乘除运算
运用BigInteger进行整数之间的高精度的加减乘除运算
92 0
|
C++
C++ 计算斐波那契数列第100万项的精确整数值
C++ 计算斐波那契数列第100万项的精确整数值
108 0