题目来源:
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 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");
}
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 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");
}