1.10494 - If We Were a Child Again

开始的时候,比较被除数和除数的长度,然后把被除数转换为长度<=除数的整数.(这样可以避免除数很大时,被除数反复转换为10进制的过程)
然后模拟除法的手算过程.题目限定n<2147483648,但一般用long long,保证中间结果不出错.

#define maxn 1000+1
int main()
{
    char num[maxn],sign[3];
    long long n;
    while(scanf("%s %s %lld",num,sign,&n)==3&&n>0)
    {
        if(num[0]=='0')
        {
            putchar('0');
            putchar('\n');
            continue;
        }
        unsigned int x=1+log10((double)n),len=strlen(num);
        long long sum=0;
        if(len<=x)
        {
            for(int i=0; i<len; i++)
                sum=10*sum+(num[i]-'0');
        }
        else if(len>x)
        {
            for(int i=0; i<x; i++)
                sum=10*sum+(num[i]-'0');
        }
        long long a=sum/n;
        int X[maxn],k=0;
        if(a!=0)///去除前导 0
        {
            X[k]=a;
            sum%=n;
            k++;
        }
        for(int i=x; i<len; i++)///必须从x开始
        {
            sum=sum*10+(num[i]-'0');
            X[k]=sum/n;
            sum%=n;
            k++;
        }///计算结果:存在X数组中的是除法结果,sum的值为求余结果.
        switch(sign[0])
        {
        case '/':
            for(int i=0; i<k; i++)
                putchar(X[i]+'0');
            break;
        case '%':
            printf("%lld",sum);
            break;
        }
        putchar('\n');
    }
    return 0;
}

你可能感兴趣的:(uva,Big_number)