一开始是的想法是用减法代替除法,一直减到被减数小于减数,所得的被减数就是余数。为了方便编程,还在减法中对齐了被减数和减数的位数。但过程还是比较麻烦,会超时。

 1 #include "stdafx.h"
 2 #include<string>
 3 #include<iostream>
 4 using namespace std;
 5 int b;
 6 string decrease(string p, string cut)
 7 {
 8     int diff=p.size()-cut.size();
 9     if(diff!=0)
10     {
11         cut=string(diff,'0')+cut;
12     }
13     int len=p.size()-1;
14     int flag=0;
15     for(int i=len;i>=0;i--)
16     {
17         if(p[i]>=cut[i])
18             p[i]=p[i]-cut[i]+'0';
19         else if(p[i]<cut[i])
20         {
21             if(p[i-1]>='1')
22             {
23                 p[i-1]-=1;
24                 p[i]=p[i]+b-cut[i]+'0';
25             }
26             else if(p[i-1]=='0')
27             {
28                 int j=i-2;
29                 while(p[j]=='0')
30                     p[j--]='0'+b-1;
31                 p[j]-=1;
32                 p[i-1]=0+b-1;
33                 p[i]=p[i]+b-cut[i]+'0';
34             }
35         }
36         if(p[i]!='0')
37             flag=i;
38     }
39     return p.substr(flag,len+1-flag);
40 }
41 int _tmain(int argc, _TCHAR* argv[])
42 {
43     string p,m;
44     while(1)
45     {
46         cin>>b;
47         if(b==0)
48             break;
49         cin>>p>>m;
50         while(p.size()>m.size()||(p.size()==m.size()&&p>=m))
51         {
52             int diff=p.size()-m.size();
53             string add1(diff,'0');
54             string cut=m+add1;
55             if(p>=cut)
56             {
57                 while(p.size()==cut.size()&&p>=cut)
58                     p=decrease(p,cut);
59             }
60             else if(p<cut)
61             {
62                 string add2(diff-1,'0');
63                 cut=m+add2;
64                 while(p.size()>cut.size())
65                     p=decrease(p,cut);
66             }
67         }
68         cout<<p<<endl;
69     }
70     return 0;
71 }

后来参考了http://blog.sina.com.cn/s/blog_7865b08301010fzf.html中的做法,发现了“一次求余数和多次求余数的效果是一样的”这个结论,具体体现在以下一段循环代码:

for(int i=0;i<p.length();i++)
{r=r*b+p[i]-'0';r %= m;
}

觉得十分巧妙。然后,注意strtol()函数的调用方法。AC代码:

#include "stdafx.h"
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;void print(int r,int b)
{if(r){print(r/b,b);printf("%d",r%b);}
}
int _tmain(int argc, _TCHAR* argv[])
{int b,m,r;string p,ms;while(scanf("%d",&b),b){cin>>p>>ms;m=strtol(ms.c_str(),0,b);r=0;for(int i=0;i<p.length();i++){r=r*b+p[i]-'0';r %= m;}if(r){print(r,b);cout<<endl;}elsecout<<'0'<<endl;}return 0;
}

转载于:https://www.cnblogs.com/vaecn/p/4805604.html

POJ 2305大数求余相关推荐

  1. 【笔试/面试】—— 从大数相减到大数求除(大数求余)

    进行大数相除的一个简单思路是:从被除数中减去除数,每减去一次,就将结果加1,直到被除数小于除数为止,此时的被除数即为大数求余的余数.从被除数中减去除数使用的是大数减法,结果+1使用的是大数加法. 大数 ...

  2. c语言怎么对大数求余,c语言取余数(c语言怎么求两数的余数)

    C语言提供了一个取余数的运算符%,称之为"模"运算符.只有两个整数之间才可以进行模运算!a % b 表示 用b来整除a,商整数,得到余数.如:5%3 = 2 4%3 =13%3 . ...

  3. c语言中int下小数求余大数,Sicily1020-大数求余算法及优化

    Github最终优化代码: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1020.c 题目如下: 1020. ...

  4. 大大大大数怎么求余?C语言

    问题: 一个特别大的数除以23求余数用C语言应该怎么算啊?比如23232323232323232323232323232323232323232323232323232323233除以23,怎么算余数 ...

  5. Large Division-----同余模定理(大数的求余)

    同余模定理 讲解转自博客: https://blog.csdn.net/qq_40873884/article/details/80312889 定义 所谓的同余,顾名思义,就是许多的数被一个数 d ...

  6. 大数问题(循环求余/快速幂求余/快速幂问题)

    大数问题 1.大数求余问题 解题思路 1.1循环求余O(n)O(n)O(n) 1.2.快速幂求余O(log⁡n)O(\log n)O(logn) 2.快速幂问题 解题思路 1.大数求余问题 在仅使用i ...

  7. 大数取余的原理和模板

    对于一个大数取余可以说是常见的题了.今天我们就聊一聊它. 代码模板: for(int i=0;i<strlen(s);i++) {ans=(ans*10+s[i]-'0')%n;//n代表我们对 ...

  8. C++实现大数运算(加减乘除求余)

    前言: 只有部分GCC编译器支持int128,而我们平常使用的软件,最大只有_int64.当这些不够用时,我们该怎么办? 我本身想写代码实现整数型大数据的加减乘除和求余,结果写着写着想着连小数运算的也 ...

  9. 求余小技巧 码农场 » POJ 3641 Pseudoprime numbers 题解 《挑战程序设计竞赛》

    // return (a * b) % m LL mod_mult(LL a, LL b, LL m) {LL res = 0;LL exp = a % m;while (b){if (b & ...

最新文章

  1. python库整理:networkx 包
  2. matlab and操作,系统建模 | Control Tutorials for Matlab and Simulink
  3. tomcat用户配置
  4. arcgis报错常用解决方法
  5. 业内人士惊暴网络求职黑幕!
  6. 解决北京户口,中科院计算所校招,CV/图像处理工程师,博士优先
  7. Shell脚本编程基础笔记一
  8. java servlet乱码问题_Java编码和servlet乱码问题(1)-Java编码
  9. python递归函数介绍
  10. vfp报表打印到PDF文件中不用输入文件名
  11. (十一)【数电】(组合逻辑电路)数据分配器和数据选择器
  12. 最新全国省市区县乡镇街道行政区划数据提取(2022年)
  13. 如何免费将XPS转换为PDF格式
  14. 计算机要重启电脑才能检测出u盘启动,u盘要电脑重启才能用
  15. 启用了被称为 HTTP 严格传输安全(HSTS)的安全策略,Firefox 只能与其建立安全连接
  16. 自驾游分享你的快乐来[有车大师]吧!
  17. oracle 10g固定执行计划,oracle 10g执行计划 (转帖)
  18. R中怎么做加权最小二乘_R方的理解与用法
  19. 帮助海外游客规划从成田机场开始日本旅行的新网站上线
  20. java将邮件保存到本地文件夹_JavaMail 邮件文件夹管理

热门文章

  1. 求组合数(完善中.......)
  2. ubuntu系统下c语言入门以及编写简单程序
  3. java求小于n的素数_java_Java实现求小于n的质数的3种方法,质数概念 质数,又称素数, - phpStudy...
  4. 3月9日—3月12日三年级课程
  5. 阿槽带你学Python(开篇)
  6. 500kV某变电站红外测温 检测技术方案
  7. 关于仙童八叛徒(转)
  8. 大班科学计算机的发明应用教案,大班科学活动神奇的圈教案
  9. 西门子plc梯形图转换c语言,西门子PLC语言SCL结构文本如何转换成LAD梯形图-工业支持中心-西门子中国...
  10. ROS kinetic 机器视觉