大数除(正整数整除)
My solution:
/*2015.10.31*/
<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
char c1[100],c2[100];
int t1[100],t2[100],result[100];
int yuchu(int *a,int *b,int n,int m)
{
int i,j;
if(n<m)
return -1;
if(n==m)
for(i=n-1;i>=0;i--)
{
if(a[i]<b[i])
return -1;
if(a[i]>b[i])
break;
}
for(i=0;i<n;i++)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i]+=10;
a[i+1]--;//向高位借1.
}
}
for(i=n-1;i>=0;i--)//找出最高位不为0的元素下标
if(a[i])
return i+1;//i+1表示处理后的t1数组的有效数组元素个数(没有前缀0) 如:001203300,有效元素个数为7
return i+1;
}
void chu(int cha,int t)
{
int n,n1,m,j;
n=t;m=t;
for(j=0;j<=cha;j++)//这里一定要加=号,t2数组从该地址(下标为cha)起到m下标结束,存放的是原始数值即同输入的除数一样
{
/*由于被除数位数不足,通过j,依次减去t2数组后缀0,从而继续调用yuchu()*/
while((n1=yuchu(t1,t2+j,n,m-j))>=0)/*n,(m-j)记录当前处理的t1,t2数组的元素个数,t2+j,表示除数从第j位开始参与处理*/
{
n=n1;
result[cha-j]++; /*(cha-j)记录的是当前求得的商存放在结果数组(result)中的下标 */
} /*每成功减一次,对应的记录商的元素加1*/
}
j=cha+1;
while(!result[--j]);/*去除前缀0,如20000/25得到的结果为(cha=3):result[3]=0,result[2]=8,result[1]=0,result[0]=0*/
for(;j>=0;j--)
printf("%d",result[j]);
printf("\n");
}
int main()
{
int i,j,l1,l2,cha;
while(scanf("%s%s",c1,c2)==2)
{
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
memset(result,0,sizeof(result));
l1=strlen(c1);
l2=strlen(c2);
if(l1<l2)
printf("0\n");
else
{
for(j=0,i=l1-1;i>=0;i--)
t1[j++]=c1[i]-'0';
for(j=0,i=l2-1;i>=0;i--)
t2[j++]=c2[i]-'0';
cha=l1-l2;/*最后求得商按位存储在result[cha]......result[0]中*/
if(cha)
{
for(i=l1-1;i>=cha;i--)
t2[i]=t2[i-cha];
for(;i>=0;i--)
t2[i]=0;
}
chu(cha,l1);
}
}
return 0;
}</span>