UVA 10494 If We Were a Child Again(大数与整型相除取整和取余)

      这道题让选手模拟相除和取余的过程,由于除数为整型,使得这道题的难度大大减小。要注意在模拟取余和相处的时候,中间的临时数会超过整型范围。

      提供一个数据:21474836447 / 2147483647

#include <stdio.h>
#include <string.h>

// 大数字符串str与整型x相除,商赋给str
void myDiv(char str[], int x) {
    int b[10000], len = strlen(str);

    for (int i=0; i<len; i++)
        b[i] = str[i] - '0';

    long long cp = 0;   // 注意这里的long long
    for (int i=0; i<len; i++) {
        long long tmp = b[i] + cp*10;
                        // 注意这里的long long
        b[i] = tmp / x;
        cp = tmp % x;
    }

    // 修正前面的0然后将结果赋给str字符串
    int i = 0, j;
    while (i<len && 0==b[i])
        i++;
    if (i == len) {
        str[0] = '0';
        str[1] = '\0';
    }
    else {
        for (j=i, i=0; j<len; j++)
            str[i++] = b[j] + '0';
        str[i] = '\0';
    }
}

// 大数字符串str与整型x取余,余数返回
int myMod(char str[], int x) {
    int len = strlen(str);
    long long tmp = 0;  // 注意这里的long long

    for (int i=0; i<len; i++) {
        tmp = tmp*10 + str[i]-'0';
        tmp %= x;
    }

    return tmp;
}

int main() {
    char str[10000], ch[5];
    int n;

    while (scanf("%s %s %d", str, ch, &n) != EOF) {
        if (ch[0] == '/') {
            myDiv(str, n);
            printf("%s\n",str);
        }
        else {
            int x = myMod(str, n);

            printf("%d\n", x);
        }
    }

    return 0;
}


 

原文地址:https://www.cnblogs.com/zcube/p/4194560.html