大数(正整数)除法之多精除以单精

 大数运算中会经常遇到多精除以单精的情况,有时也会把某些除法分解成多精除以单精加快运行速度,这里所说单精数是不超过cpu位长二分这一的数,32位机是65535,

在此以千进制数为例讲解一下具体实现,

       For i = 1 To 被除数数组长度

            运算结果(i) = 被除数(i) \ 单精数
            被除数(i + 1) = (被除数(i) Mod 单精数) * 1000 + 被除数(i + 1)

       Next

用实例演示一下:123 456 789 125 /234

运算结果(1)=123 \ 234=0                          '被除数(1) 中初始存放123,234为除数

被除数(2)=(123 mod 234) *1000+456=123456       ‘1000为千进制数的基,(123 mod 234) *1000的结果为123000,被除数(2)中初始存放456

 

运算结果(2)=123456\ 234=527                          '被除数(2) 中存放123456,234为除数

被除数(3)=(123456 mod 234) *1000+789=138789       ‘1000为千进制数的基,(123456 mod 234) *1000的结果为138000,被除数(3)中初始存放789

 

 

 

运算结果(3)=138789\ 234=593                        '被除数(3) 中存放138789,234为除数

被除数(4)=(138789 mod 234) *1000+125=027125      ‘1000为千进制数的基,(138789 mod 234) *1000的结果为027000,被除数(4)中初始存放125

 

 

 

运算结果(4)=027125\ 234=115                      '被除数(4) 中存放138789,234为除数

被除数(5)=(027125 mod 234) *1000+0=215000     ‘1000为千进制数的基,(027125 mod 234) *1000的结果为215000 ,被除数(5)中初始存放0

此时运算结果数组中依次存放000 527 593 115 为该除法的整数商,若要计算到小数后某某位,可以通过扩充被除数长度实现。

 

这段代码在提升落叶高精度表达式计算器1.2的速度中发挥出关键作用,因为它简洁,逻辑结构清晰,易于插入各子程序中。

 

下面是网上收集的一段多精除以单精c代码:

 

  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     char a[510];  
  8.     int c[510];   
  9.     int b,l;  
  10.     while (~scanf("%s%d",&a,&b))  
  11.     {  
  12.         memset(c,0,sizeof(c));   
  13.         l=strlen(a);  
  14.         int ys=0;  
  15.         int t=0,temp,i;  
  16.         for (i=0;i<l;i++)  
  17.         {  
  18.             temp=a[i]-'0'+10*ys;
  19.             if (temp>=b)  
  20.             {  
  21.                 c[t]=temp/b;  
  22.                 ys=temp % b ;  
  23.                 t++;  
  24.             }  
  25.             else ys=temp;  
  26.         }  
  27.         while (c[i]==0) i--;  
  28.         for (int j=i;j>=0;j--)  
  29.             printf("%d",c[j]);  
  30.         if (ys) printf(" %d",ys);  
  31.             printf("\n");  
  32.     }  
  33.     return 0;  
  34. }  
  35.  

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
落叶高精度表达式计算器V1.0(32位)版 本计算器程序是在win7 32位系统上,使用VB6.0开发的,本程序的主要特点是: 1) 高精度,支持万位精度的有理数常用运算; 包括:加,减,乘,除,乘方,开N次方,三角函数,反三角函数,双曲三角函数,反双曲三角函数等。 2) 表达式运算,本程序没有采用常用计算器的边输入边计算,而是输入完所有数据或算式后,解析表达式,分解运算符和数据,最后在运算出结果。 点击程序界面上的等于按钮,计算器开始运算。 3) 本计算器的各种运算函数大都是自已所写,没有调用大数库或其它数学库,仅大数开平方调用GMP大数库。 本计算器的各种子函数是通过定义的一个高精度数据结构接收和返回运算结果,这个高精度数据结构可以定义有符号(整数,小数,科学计数法表示的数), 函数内部集中对数值,小数点位置,指数进行运算,优点是调用简单,不易出错,可以说比较完善,综合运算能力强。 这点和大数库的实现不同, 大数库大都只提供对整数的运算,假如要对有理数运算, 一:你需要很多的调用前和调用后处理工作,这些工作并不需要很高的知识,但却需要很长时间的调试,它并不会因为你的水平很高而获得很大的时间提升。 二:很难进行综合运算。当你把某一个函数调顺后,进行综合运算时,会出现很多新的问题。 高精度数据结构VB定义为: Type StrToZx '高精度数的结构头 ZhFhBz As Boolean '正负号标志 XsdWz As Long '小数点右边数字的长度。例1234.567中这个数是3(为什么要这样定义,因为大多的基本运算都是右对齐的,这样定义减少了中间一些不必要的转换) JzBz As Integer '标记数组存的是什么进制的数(十进制或其它进制数) strlen As Long '运算数长度 Zx() As Long '存放运算数的数组 eE As Long '存放指数 End Type 4)综合运算,里面的三角函数,用户界面的算式,表达式运算,都是综合运算的体现,综合运算是大量基础运算的集合,中间稍有差错,就会算不出正确答案,里面内容繁琐,这里简单介绍一下。 5)本程序从2015年11月开始试编写,至2016年8月大致完成,开发周期很长,中间代码写了一两万行,从零基础到运行效率,综合效率的初中等水平,主要目的是练习编程,老外的数学软件已很强大,是我不可能相比的,我觉得我的程序如果把程序源码作为大数实例初级学习更合适。 6)程序中函数都具有输入值较验功能,若输入错误,会弹出提示窗口提示那一个函数输入错误。 7)由于本人是初次编程练习,且自身知识的不足,加上精力有限,最后的测试收尾也只是简单测试,里面肯定存在很大的不足和没发现的BUG,请网友们在论坛,或 我的邮箱:wtbzhy@126.com, 微博:qq_34030789,中指正,交流。 我若纠错后,会在下载网站更新,并根据您的地址发一份给您,谢谢! 再次欢迎大家使用本计算器,本计算器具有很好的表达式解析功能,会在以后的使用中获得很好的用户体验!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值