您的位置:首页 > 编程语言 > C语言/C++

OpenJudge百炼-2737-大整数除法-C语言-高精度计算

2017-08-14 16:44 561 查看
描述:

求两个大的正整数相除的商。

输入:

第1行是被除数,第2行是除数。每个数均不超过100位。

输出:

一行,相应的商的整数部分

样例输入:

2376

24

样例输出:

99


/***********************************************
**文件名:百炼-2737
**Copyright (c) 2015-2025 OrdinaryCrazy
**创建人:OrdinaryCrazy
**日期:20170813
**描述:百炼2737参考答案
**版本:1.0
************************************************/
/***********************************************
基本的思想就是反复做除法,看看从被除数里最多能减去多少个除数
************************************************/
#include <stdio.h>
#include <string.h>
int dividend[100],divisor[100],quotient[100],len1,len2;
char line1[101],line2[101];
/***************************************************
长度为lenn1的大整数p1减去长度为lenn2的大整数p2
减得结果放在p1里返回值代表结果的长度,不够减返回-1,正好剪完返回0
****************************************************/
int substract(int* p1,int* p2,int lenn1,int lenn2)
{
int i;
if(lenn1 < lenn2) return -1;
if(lenn1 == lenn2)
for(i = lenn1-1;i>=0;i--)
{
if(p1[i] > p2[i])
break;
else if(p1[i] < p2[i]) return -1;
else continue;
}
for(i = 0;i < lenn1;i++)
{
p1[i] -= p2[i];
if(p1[i] < 0)
{
p1[i] += 10;
p1[i+1]--;
}
}
for(i = lenn1-1;i >= 0;i--)
if(p1[i]) break;
return i+1;
}
int main()
{
int i,j;
gets(line1);
gets(line2);
len1 = strlen(line1);
len2 = strlen(line2);
for(i = len1-1,j = 0;i >= 0;i--,j++)
dividend[j] = line1[i] - '0';
for(i = len2-1,j = 0;i >= 0;i--,j++)
divisor[j] = line2[i] - '0';
len1 = substract(dividend,divisor,len1,len2);
if(len1 == -1)
{
printf("0");
return 0;
}
if(len1 == 0)
{
printf("1");
return 0;
}
quotient[0]++;
int times = len1 - len2;
for(i = len1-1;i >= 0;i--)
{
if(i >= times)
divisor[i] = divisor[i - times];
else
divisor[i] = 0;
}
len2 = len1;
for(j = 0;j <= times;j++)
{
int tmp;
while((tmp = substract(dividend,divisor+j,len1,len2-j)) >= 0)
{
len1 = tmp;
quotient[times-j]++;
}
}
for(i = 0;i < 99;i++)
if(quotient[i] >= 10)
{

4000
quotient[i+1] += quotient[i]/10;
quotient[i] %= 10;
}
i = 99;
while(!quotient[i] && i >=0) i--;
if(i == -1)
printf("0");
else
while(i >= 0)
printf("%d",quotient[i--]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: