2737 大整数除法

题目来源:
http://bailian.openjudge.cn/practice/2737/

大整数除法
描述
求两个大的正整数相除的商。
输入
第1行是被除数,第2行是除数。每个数均不超过100位。
输出
一行,相应的商的整数部分
样例输入
2376
24
样例输出
99


题意描述:
计算位数不超过100位的两个数的商(整数部分)


解题思路:

用减法从被除数上一次一次减去除数得到商


程序代码:
#include<stdio.h>
const int N=230;
char str1[N],str2[N];
int  a[N],b[N],result[N];
#include<string.h>


int Substract(int *p1,int *p2,int l1,int l2);


void outputf(int *s);


int main()
{
int i,j,k,l1,l2,n;
while(scanf("%s%s",str1,str2) != EOF)
{
l1=strlen(str1);
l2=strlen(str2);
if(l1<l2)
{
printf("0\n");
continue;
}

for(j=0,i=l1-1;i>=0;i--)
a[j++]=str1[i]-'0';
for(j=0,i=l2-1;i>=0;i--)
b[j++]=str2[i]-'0';

l1=Substract(a,b,l1,l2);//先减一次去除不够减和刚好够减的情况 
if(l1<=0)
{
if(l1<0) {
printf("0\n");
continue;
}
else {
printf("1\n");
continue;
}
}
memset(result,0,sizeof(result));
result[0]++;

n=l1-l2;//减过一次后的长度差 
if(n<0) {//减过一次后不够减 商为1 
printf("1\n"); 
continue; 

else if(n>0) {//当长度大于时将除数高位补零补齐 
for(i=l1-1;i>=0;i--) {
if(i>=n)//倒着存储当i大于等于n时,将i的位置存i-n的值,否则存0 
b[i]=b[i-n];
else
b[i]=0;
}
}
l2=l1;//经过之前的处理,除数和被除数长度相等 
for(j=0;j<=n;j++) //依次去除高位补零后相减 
{
while( (k=Substract(a,b+j,l1,l2-j)) >=0) { 
l1=k;//更新长度 
result[n-j]++;//n-j是对应的位权 
}
  }
outputf(result);//输出结果时记得处理进位 
}
return 0;

 }


 int Substract(int *p1,int *p2,int l1,int l2)
 {
  int i;
  if(l1<l2)
  return -1;
 
  bool bLarge=false;//判断被除数是否大于除数 
  if(l1==l2) {
  for(i=l1-1;i>=0;i--) {
  if(p1[i]>p2[i])
  bLarge=true;
  else if(p1[i]<p2[i]) {
  if(!bLarge)//除数大时返回负值 
  return -1;
      }
       }
  }
for(i=0;i<l1;i++) {//被除数大于除数时相减 
  p1[i] -= p2[i];
  if(p1[i]<0) {
  p1[i] += 10;
  p1[i+1]--;
  }
  
for(i=l1-1;i>=0;i--)
   if(p1[i])
   return i+1;//返回长度加1 
return 0;
 }

 void output(int *s)
 {
  int i,j;
  for(i=0;i<N;i++){
if(s[i]>=10) {//如果需要进位,先进位再存储本位 
s[i+1] +=s[i]/10;
s[i] %= 10; 
}
}

  for(i=N;i>=0;i--) {
  if(s[i] != 0 || i==0)
  break;
  }
for(j=i;j>=0;j--) 
printf("%d",s[j]);
printf("\n");
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值