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

四位数,五位数同理即可


目录
相关文章
|
算法 C++ 索引
【C++STL基础入门】深入浅出string类查找字串、返回字串和交换操作
【C++STL基础入门】深入浅出string类查找字串、返回字串和交换操作
1020 1
|
C语言 Windows
【初阶C语言】关于scanf函数的超详细介绍和多组输入
【初阶C语言】关于scanf函数的超详细介绍和多组输入 我们学习一个函数,要围绕三个点:1.函数是什么 2.函数的用法 3.注意的细节
1165 0
|
Linux C语言
Linux命令(116)之journalctl
Linux命令(116)之journalctl
610 0
|
存储 监控 算法
|
5月前
|
人工智能 自然语言处理 Rust
【内附榜单】评估AI大模型的代码修复能力!Multi-SWE-bench:字节开源代码修复能力评估基准,覆盖7大主流编程语言
Multi-SWE-bench是首个覆盖Python外7种主流编程语言的代码修复基准,包含1632个真实GitHub问题样本,通过严格筛选与人工验证确保数据质量。
310 0
【内附榜单】评估AI大模型的代码修复能力!Multi-SWE-bench:字节开源代码修复能力评估基准,覆盖7大主流编程语言
|
缓存 关系型数据库 MySQL
在 MySQL 中使用 SPACE 函数
【8月更文挑战第5天】
321 3
在 MySQL 中使用 SPACE 函数
|
Java 索引
|
自然语言处理 Linux C++
make和Cmake都有什么区别?(内附使用详解)
make: 是一个构建工具,它的任务是读取 Makefile 文件,并基于这些文件中的指令执行具体的构建操作。Makefile 文件包含了如何构建项目的规则,make 负责解析这些规则并执行必要的命令来编译和链接源代码,生成可执行文件或库。 CMake: 是一个构建系统生成器。它并不直接进行编译或链接,而是根据项目中 CMakeLists.txt 文件的内容生成一个或多个构建系统的描述文件(如 Makefile 或 Visual Studio 解决方案)。CMake 提供了一种更高级、更抽象的方式来描述构建过程,这使得它能够跨平台地生成各种构建系统。
1233 0
|
C语言
【C深度解剖】取模与取余
【C深度解剖】取模与取余
217 0
|
存储 监控 Ubuntu
日志切割工具-Logrotate实现nginx日志切割
日志切割工具-Logrotate实现nginx日志切割
217 0

热门文章

最新文章