/*大整数的除法(核心是大整数的是减法)*/
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
#define MAX_LEN 200
char s1[MAX_LEN+10];
char s2[MAX_LEN+10];
int an1[MAX_LEN+10]={0};/*被除数,an1[0]对应于个位*/
int an2[MAX_LEN+10]={0};/*除数,an2[0]对应于个位*/
int result[MAX_LEN+10] = {0};/*存放商,aresult[0]对应于个位*/
/*substract函数:长度为len1的大整数p1减去长度为len2的大整数p2的结果放在p1里面,返回值代表结果的长度
如果不够减 则返回值为0 p1[0],p2[0]是个位*/
int Substract(int *p1,int *p2,int len1,int len2)
{
int i;int flag=0;
/*下面是判断p1是否比p2大,如果不是,则返回-1*/
if(len1<len2)
return -1;
if(len1==len2)
{
for(i=len1-1;i>=0;i--)
{
if(p1[i]>p2[i])
flag=1;
else if(p1[i]<p2[i])
{
if(flag==0)
return -1;
}
}
}
for(i=0;i<len1;i++)
{/*做减法*/
p1[i]-=p2[i];//在调用此函数的时候,要求当i>=len2时p2[1]==0
if(p1[i]<0)
{
p1[i]+=10;
p1[i+1]--;
}
}
for(i=len1-1;i>=0;i--)
if(p1[i])
{
return i+1;
break;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,j;
int ntimes=0;
int len1=0,len2=0;
cin >> s1 >> s2;
len1=strlen(s1);
len2=strlen(s2);
j=0;
for(i=len1-1;i>=0;i--)
an1[j++]=s1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
an2[j++]=s2[i]-'0';
if(len1<len2)
{
cout << 0 <<endl;
return 0;
}
len1=Substract(an1,an2,len1,len2);
if(len1<0)
{
cout << 0 << endl;
return 0;
}
else if(len1==0)
{
cout << 0 <<endl;
return 0;
}
result[0]++;//减掉一次了,商加一,减掉一次后的结果长度是len1
ntimes=len1-len2;
if(ntimes>0)
{//将an2乘以10的某次幂,使得结果的长度和an1相同
for(i=len1-1;i>=0;i--)
{
if(i>=ntimes)
an2[i]=an2[i-ntimes];
else
an2[i]=0;
}
}
else if(ntimes<0)
goto outputresult;
len2=len1;
for(j=0;j<=ntimes;j++)
{
int ntmp;
//一直减到不够为止
//先减去若干个an2x(10的ntimes次方)
//不够减了,再减去若干an2x(10的ntimes-1次方),……
while((ntmp=Substract(an1,an2+j,len1,len2-j))>=0)
{
len1=ntmp;
result[ntimes-j]++;//每成功减一次,则将商的相应的位加一
}
}
outputresult:
//下面的循环统一处理进位的问题
for(i=0;i<MAX_LEN;i++)
{
if(result[i]>=10)
{
result[i+1]+=result[i]/10;
result[i]%=10;
}
}
//下面输出结果
bool IsStartOutput = false;
for(i = MAX_LEN;i>= 0; i--)// 0000001001
{
if(IsStartOutput)
cout << result[i];
else if(result[i])
{
cout << result[i];
IsStartOutput = true;
}
}
if(!IsStartOutput)
cout << 0;
return 0;
}
C++ 大整数加减乘除 代码
4星 · 超过85%的资源 需积分: 14 104 浏览量
2011-07-25
21:07:38
上传
评论
收藏 3KB ZIP 举报
JamyCai
- 粉丝: 43
- 资源: 153
最新资源
- 老飞飞搭建基础通用数据库V19数据库.rar
- jquery.js
- 机械设计多工位ACF贴胶带&预压设备sw18可编辑非常好的设计图纸100%好用.zip
- 基于Pytorch复现Point-Transformer,用于ShapeNet数据集点云分割
- 【医学影像分析】2D超声图像的分割检测(Ultrasound Nerve Segmentation - Kaggle数据集)
- 嘎嘎香的五款神仙谷歌插件
- .arch书源导入教程.mp4
- 贪心算法介绍及代码示例讲解
- CR13SP35MSI64 Crystal 水晶报表运行组件最后版本64位
- 图像分类数据集:玉米叶是否感染分类数据集(2分类,包含训练集、验证集)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈