高精度除法
发布时间:2020-12-14 02:49:39 所属栏目:大数据 来源:网络整理
导读:/*核心思想:除法化减法,考察从被除数里最多能减去几个除数,商就为几。就是考察除数的1次倍,10次倍,100次倍.....分别有几个。*/#include stdio.h#include string.h#define MAX_LEN 200char szLine1[MAX_LEN + 10];char szLine2[MAX_LEN + 10];int an1[MA
/* 核心思想:除法化减法,考察从被除数里最多能减去几个除数, 商就为几。 就是考察除数的1次倍,10次倍,100次倍.....分别有几个。 */ #include <stdio.h> #include <string.h> #define MAX_LEN 200 char szLine1[MAX_LEN + 10]; char szLine2[MAX_LEN + 10]; int an1[MAX_LEN + 10]; //被除数,an1[0]对应于个位 int an2[MAX_LEN + 10]; //除数,an2[0]对应于个位 int aResult[MAX_LEN + 10]; //存放商 //长度为 nLen1 的大整数p1 减去长度为nLen2 的大整数p2 //结果放在p1 里,返回值代表结果的长度 //如不够减返回-1,正好减完返回 0 int Substract( int * p1,int * p2,int nLen1,int nLen2) { int i; if( nLen1 < nLen2 ) return -1; //下面判断p1 是否比p2 大,如果不是,返回-1 if( nLen1 == nLen2 ) { for( i = nLen1-1; i >= 0; i -- ) //从高位开始比较 { if( p1[i] > p2[i] ) break; //p1>p2 else if( p1[i] < p2[i] ) return -1; //p1<p2 } } for( i = 0; i < nLen1; i ++ ) { //调用本函数确保当i>=nLen2 时,p2[i] = 0 p1[i] -= p2[i]; if( p1[i] < 0 ) { p1[i]+=10; //借位 p1[i+1] --; } } for( i = nLen1 -1 ; i >= 0 ; i-- ) if( p1[i] ) //找到最高位第一个不为0 return i + 1; return 0; //全部为0,说明两者相等 } int main() { int t,n; scanf("%d",&n); for( t = 0; t < n; t ++ ) { scanf("%s",szLine1); scanf("%s",szLine2); int i,j; int nLen1 = strlen( szLine1); int nLen2 = strlen(szLine2); memset( an1,sizeof(an1)); memset( an2,sizeof(an2)); memset( aResult,sizeof(aResult)); for( j = 0,i = nLen1 - 1;i >= 0 ; i --) an1[j++] = szLine1[i] - '0'; for( j = 0,i = nLen2 - 1;i >= 0 ; i --) an2[j++] = szLine2[i] - '0'; if( nLen1 < nLen2 ) { printf("0n"); continue; } int nTimes = nLen1 - nLen2; //两个数相差的10的最大次倍 if(nTimes > 0) { for( i = nLen1 -1; i >= nTimes; i -- ) an2[i] = an2[i-nTimes]; //朝高位移动 for( ; i >= 0; i--) //低位补0 an2[i] = 0; nLen2 = nLen1; //两数最高位对齐,修改p2长度(便于除法运算) } for( j = 0 ; j <= nTimes; j ++ ) { int nTmp; //先减去若干个 an2×(10 的 nTimes 次方),一直减到不够减为止 //不够减了,再减去若干个 an2×(10 的 nTimes-1 次方),...... while( (nTmp = Substract(an1,an2+j,nLen1,nLen2-j)) >= 0) { nLen1 = nTmp; aResult[nTimes-j]++; //每成功减一次,则将商的相应位加1 } } //下面输出结果,先跳过高位0 for( i = MAX_LEN ; (i >= 0) && (aResult[i] == 0); i -- ); if( i >= 0) for( ; i>=0; i--) printf("%d",aResult[i]); else printf("0"); printf("n"); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何跳过类似于Haskell模式匹配的Perl列表赋值中的元素?
- 当TFS\/VSTS遇上Power BI
- perl – Attribute is =>’可能[SomeSubtype]’返回Attribu
- 为什么不能在64位Delphi中使用地址嵌套本地函数?
- mos管原理
- vb标准(三):代码结构
- Lua入门系列----pil学习笔记之 Type and Values (1)
- Delphi 与 DirectX 之 DelphiX(68): TDIB.DoNovaEffect();
- Django Rest Framework(分页、视图、路由、渲染器)
- groovy – @CompileStatic给出NullPointerException