Demo entry 6625363

aa

   

Submitted by anonymous on Jun 20, 2017 at 12:01
Language: C. Code size: 2.4 kB.

#include<stdio.h>
#include<string.h>
#define MAX 100
/*
minus函数功能:
长度为len1的大整数减去长度为len2的大整数
结果存在p1中,返回结果的位数
若不够减返回-1,两数相等返回0
*/
int minus(int *p1,int *p2,int len1,int len2)
{
    int i;
    if(len1<len2) return -1;
    if(len1==len2){
        for(i=len1-1;i>=0;i--){ //判断是否够减
            if(p1[i]>p2[i]) break;
            else if(p1[i]<p2[i]) return -1;
        }
    }
    for(i=0;i<len1;i++){ //从低位开始做减法
        p1[i]-=p2[i];
        if(p1[i]<0){  //不够减就借位
            p1[i]+=10;
            p1[i+1]--;
        }
    }
    for( i=len1-1; i>=0; i-- ){      //查找结果的最高位
        if( p1[i] ){              //最高位第一个不为0
            return (i+1);
        }
    }                            //得到位数并返回
    return 0;
}
void my_divi(char *s1,char *s2,char *s)
{
    int i,j,len1,len2,num1[MAX],num2[MAX],num3[MAX];
    int nTimes,nTemp;
    for(i=0;i<MAX;i++){
        num1[i]=num2[i]=num3[i]=0;
    }
    len1=strlen(s1);
    len2=strlen(s2);
    if(len1<len2){
        s[0]='0';
    }else{
        for(i=0,j=len1-1;j>=0;j--,i++){  //将字符串转换成对应的整数,颠倒存储
            num1[i]=s1[j]-'0';
        }
        for(i=0,j=len2-1;j>=0;j--,i++){
            num2[i]=s2[j]-'0';
        }
        nTimes = len1 - len2;    //相差位数
        for (i=len1-1;i>=0;i--)    //将除数扩大,使得除数和被除数位数相等
        {
            if ( i>=nTimes )
                num2[i] = num2[i-nTimes];
            else                     //低位置0
                num2[i] = 0;
        }
        len2 = len1;
        for(j=0;j<=nTimes; j++)      //重复调用,同时记录减成功的次数,即为商
        {
            while((nTemp=minus(num1,num2+j,len1,len2-j)) >= 0)
            {
            len1 = nTemp;      //结果长度
            num3[nTimes-j]++;//每成功减一次,将商的相应位加1
            }
        }
        i=MAX-1;
        while(num3[i]==0&&i>=0) i--;
        for(j=0;i>=0;i--,j++){
            s[j]=num3[i]+'0';
        }
        s[j]='\0';
    }
}
int main()
{
    char s1[MAX+2],s2[MAX+2],s[MAX+2];
    scanf("%s%s",s1,s2);
    if(s1[0]=='-'){
        if(s2[0]=='-'){
            my_divi(s1+1,s2+1,s);
        }else{
            s[0]='-';
            my_divi(s1+1,s2,s+1);
        }
    }else{
        if(s2[0]=='-'){
            s[0]='-';
            my_divi(s1,s2+1,s+1);
        }else{
            my_divi(s1,s2,s);
        }
    }
    printf("%s\n",s);
    return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).