高精度大数(超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中的方式即可

四位数,五位数同理即可


目录
相关文章
|
4月前
|
Java
BigDecimal类型的数据如何做绝对值和相除求百分比
BigDecimal类型的数据如何做绝对值和相除求百分比
91 3
|
4月前
【每日一题Day201】LC2436有效时间的数目 | 乘法原理 枚举
【每日一题Day201】LC2436有效时间的数目 | 乘法原理 枚举
39 2
|
1月前
|
算法
【算法】位运算算法——两整数之和
【算法】位运算算法——两整数之和
|
3月前
|
存储 算法 Python
技术心得记录:大整数算法【10】Comba乘法(实现)
技术心得记录:大整数算法【10】Comba乘法(实现)
21 0
|
4月前
|
算法 前端开发
前端算法-二进制求和
前端算法-二进制求和
运用BigInteger进行整数之间的高精度的加减乘除运算
运用BigInteger进行整数之间的高精度的加减乘除运算
78 0
|
算法 前端开发
前端算法-各位相加
前端算法-各位相加
|
人工智能 算法 C++
【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
牛客网2016.4.11(两个数相加为sum/计数一个int型的二进制有多少个1/二叉树是否左右对称)
牛客网2016.4.11(两个数相加为sum/计数一个int型的二进制有多少个1/二叉树是否左右对称)
|
前端开发 JavaScript Java
前端基础面试题 简单复杂数据类型检测转换、阶乘、绝对值、圣诞...
前端基础面试题 简单复杂数据类型检测转换、阶乘、绝对值、圣诞...
165 0
前端基础面试题 简单复杂数据类型检测转换、阶乘、绝对值、圣诞...