大数除法是我们必须要会的一个算法,不仅仅因为我们经常遇到该类型习题,而且请读者盆友想一想,作为计算机的专业工作人员,我们每天要处理多少条信息。这个数字恐怕早已超过long long 的范围了。所以大数除法,必须要会。

我们以一道习题来引入课题。
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。
输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。
输出格式:

在一行中输出相应的最小的s和n,其间以1个空格分隔。
输入样例:

31

输出样例:

3584229390681 15

这是一道典型的大数相除的习题。怎么处理呢?
请读者现在拿起笔,任意写两个数做除法。我们来观察其中有什么规律。
如:
被除数为13486 除数为4
被除数 除数 商 余数
13 4 3 1
14 4 3 2
28 4 7 0
6 4 1 2
结果是 商为3371 余数为2;
大家看到这里有什么想法么,或许,写成这样更有规律性:
被除数 除数 商 余数
010+1 4 0 1
1
10+3 4 3 1
110+4 4 3 2
2
10+8 4 7 0
010+6 4 1 2
所以最终商是3371,余数为2
这下读者很轻易就看出了规律,是的,把被除数从最高为开始的每一位打出来分别与除数相除,得到商和余数,再把该余数
10再加上下一位被除数作为新的被除数,重复此操作,由表格,商的位数一定和被除数的位数相同(开头的0最后再删去即可),就可以得出代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{string dividend,result;int divisor,shang,remainder=0;cin>>dividend;cin>>divisor;for(int i=0;i<dividend.size();i++){shang=(remainder*10+(dividend[i]-'0'))/divisor;remainder=(remainder*10+dividend[i]-'0')%divisor;result.push_back(char(shang+'0'));}while(1){if(result[0]=='0')result.erase(result.begin(),result.begin()+1);if(result[0]!='0') break;}cout<<result<<endl;return 0;
}

是不是很简单,那个循环里面连循环跳出的条件都不用管了,就因为商的位数一定和被除数相同,最后再把商最前面的0删去即可。
当然,我们最好可以把这个操作写成函数,便于以后的使用。

string large_number_devision(string dividend,int divisor)
{string result;int shang,remainder=0;for(int i=0;i<dividend.size();i++){shang=(remainder*10+(dividend[i]-'0'))/divisor;remainder=(remainder*10+dividend[i]-'0')%divisor;result.push_back(char(shang+'0'));}while(1){if(result[0]=='0')result.erase(result.begin(),result.begin()+1);if(result[0]!='0') break;}return result;
}

有了这个函数,翁恺老师的那道题就很容易了。

#include<iostream>
#include<string>//我们还是先来写大数除法的函数
using namespace std;//思想就是那个思想,不过我们只讨论没有余数情况
bool judge=false;
string extreme_large_num_div(string dividend,int divisor);
string rid_zero(string str);
int main()
{int divisor,len;string dividend("1");string result;cin>>divisor;while(1){result=extreme_large_num_div(dividend,divisor);if(judge==true) break;dividend.insert(dividend.begin(),'1');}len=result.size();result=rid_zero(result);cout<<result<<" "<<len<<endl;return 0;
}
string extreme_large_num_div(string dividend,int divisor)
{string result;int remainder=0,temp;for(int i=0;i<dividend.size();i++){temp=(remainder*10+(dividend[i]-'0'))/divisor;remainder=(remainder*10+(dividend[i]-'0'))%divisor;result.push_back((char)(temp+'0'));}if(remainder==0) judge=true;return result;
}
string rid_zero(string str)
{while(1){if(str[0]!='0') break;if(str[0]=='0') str.erase(str.begin(),str.begin()+1);}return str;
}

用C++模拟大数的除法 ————墨白相关推荐

  1. 用html写除法竖式代码,模拟竖式除法

    Description 设有下列的算式: 8 0 9 ----------- 口口)   口口口口 口口 ----------- 口口口 口口口 ----------- 1 求出□中的数字,并打印出完 ...

  2. 2017前端该学的知识 分享墨白的文章、大家共勉!

    前言 现在年底,各个公司或团队都会让大家写写年终总结或2017年的计划,我们团队在这周五也进行了上半场的总结会.那作为一名前端工程师,在2017年可以学些什么,所以来看看Artem Sapegin的计 ...

  3. pku 2635 The Embarrassed Cryptographer 数论——素数筛选法+模拟大数除法

    http://poj.org/problem?id=2635 因为给定的k是两个素数的乘机,所以该数所包含的因子是{1,K,p,q}假设k = p*q p,q为素数,所以只要从小到大枚举小于L的素数, ...

  4. 深渊水妖 模拟,贪心 牛客白月赛44

    链接:https://ac.nowcoder.com/acm/contest/11221/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52 ...

  5. poj2325 大数除法+贪心

    将输入的大数除以9 无法整除再除以 8,7,6,..2,如果可以整除就将除数记录,将商作为除数继续除9,8,...,3,2. 最后如果商为1 证明可以除尽 将被除过的数从小到大输出即可 #includ ...

  6. 大数运算(5)——大数除法(取模、取余)

    有关于大数除法的运算可以大致分为两种:一种是求商(取模),另一种是求余数(取余). 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>= ...

  7. C语言大数运算-乘除法篇

    前言: 这是第三篇博客,也是一次介绍二个计算的博客,可能难度会比前两篇博客大一点,所以建议对于初学者来说一定要看完我的前两篇博客再来看本篇博客,关于本次实验的环境,和思想在第一篇博客已经简单介绍过了, ...

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

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

  9. 模拟法计算大数加减乘除 (附带例题)

    模拟法计算大数加减乘除就是模拟列竖式的方法计算 大数加法 模拟竖式加法 首先是第一步先最低位对齐吧 例如: 1 2 3 4 5 6 7 8 92 0 0 0 1 1 2 8 我是这样子在实现的 str ...

最新文章

  1. 11款新品,一切为了落地!商汤:普惠AI的时代,来了
  2. CentOS 6.x 使用安装光盘作为yum源
  3. 堆实战(动态数据流求top k大元素,动态数据流求中位数)
  4. 配置切入点表达式|| 前置通知、后置通知、异常通知、最终通知、环绕通知
  5. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(8)- 从Raw NAND启动
  6. div固定大小文字溢出自动缩小_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!
  7. vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法
  8. 俩层判断,判断button是否可以点击
  9. android studio运行模拟器报错请求超时_GDA关于android脱壳的问题说明
  10. PyQt5笔记(01) -- 创建空白窗体
  11. ASP.NET无法识别的配置节connectionStrings的解决方法
  12. Zookeeper知识
  13. Appium Server
  14. springboot校园二手交易平台的设计与实现毕业设计源码260839
  15. 如何查看谷歌卫星地图每级分辨率的两种方法
  16. 《客户端性能测试基本流程》
  17. 最简单的U盘安装windows系统教程
  18. 2021年焊工(初级)模拟考试题及焊工(初级)模拟考试题库
  19. UTM-wgs84投影坐标系
  20. 老调重弹,Squirrel,FASTCGI

热门文章

  1. 习题 6.12 有一行电文,已按下面规律译成密码:...即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。
  2. 量子计算机淘汰了吗,量子计算机将淘汰目前的所有计算机
  3. 加州大学伯克利分校与NTT合作以加速采用智能技术
  4. Algebraic Foundations ( Arithmetic and Algebra) CGAL 4.13 -User Manual
  5. Error Calling Method of a PBNI object 的问题现象及解决方案
  6. 日语二级语法汇总(part8/16)
  7. Android 7.0 适配 FileProvider相机 相册 裁剪的使用
  8. 联想计算机M.2固态银盘,联想天逸510s 08IKL更换M.2 PCIE 固态硬盘后装系统,亲测有效...
  9. c++ TSan(Thread Sanitizer)线程检测工具
  10. Spark 练习测试题(答案仅供参考)