ZOJ-3167

来源:互联网 发布:业余程序员该如何赚钱 编辑:程序博客网 时间:2024/06/01 09:45

这题内存竟然用了16M多。。我知道是大数乘的时候没有free中间变量的原因,但是一加free的代码就一直RE。。至今没找到原因,真是坑啊,待我慢慢摸索吧。。

#include<stdio.h>#include<string.h>#include<stdlib.h>void reverse(char *s){    int len = strlen(s);    int i, j;    char c;    for (i = 0, j = len - 1; i < j; i++, j--)    {        c = *(s + i);        *(s + i) = *(s + j);        *(s + j) = c;    }}char *appendTailZero(char *s, int zeros){    int i, len = strlen(s);    char *r = malloc(len + zeros + 1);    for (i = 0; i < len; i++)        *(r + i) = *(s + i);    for (i = len; i < len + zeros; i++)        *(r + i) = '0';    *(r + len + zeros) = '\0';    return r;}char *add(char *s1, char *s2){    int l1 = strlen(s1);    int l2 = strlen(s2);    int len = l1 > l2 ? l1 : l2;    char *r = malloc(len + 2);    int i, prev = 0, a, b, sum;    for (i = 0; i < len; i++)    {        a = l1 - 1 - i >= 0 ? *(s1 + l1 - 1 - i) - '0' : 0;        b = l2 - 1 - i >= 0 ? *(s2 + l2 - 1 - i) - '0' : 0;        sum = a + b + prev;        *(r + i) = sum > 9 ? sum - 10 + '0' : sum + '0';        prev = sum > 9 ? 1 : 0;    }    if (prev)    {        *(r + len) = '1';        *(r + len + 1) = '\0';    }    else        *(r + len) = '\0';    reverse(r);    return r;}char *multiplyHelper(char *s1, int digit){    int i, res, prev = 0, len = strlen(s1);    char *r = malloc(len + 2);    if (!digit)    {        *r = '0';        *(r + 1) = '\0';        return r;    }    for (i = 0; i < len; i++)    {        res = (*(s1 + len - 1 - i) - '0') * digit + prev;        *(r + i) = res % 10 + '0';        prev = res / 10;    }    if (prev)    {        *(r + len) = prev + '0';        *(r + len + 1) = '\0';    }    else        *(r + len) = '\0';    reverse(r);    return r;}char *multiply(char *s1, char *s2){    if (strlen(s1) < strlen(s2))    {        char *temp;        temp = s1;        s1 = s2;        s2 = temp;    }    int l2 = strlen(s2);    int i;    char *t, *zt;    char *sum = malloc(2);    sum = "0";    for (i = 0; i < l2; i++)    {        char *tp = sum;        t = multiplyHelper(s1, *(s2 + l2 - 1 - i) - '0');        zt = appendTailZero(t, i);        sum = add(tp, zt);        free(t);        free(zt);    }    return sum;}int main(){    int k;    char m[5];    while (scanf("%d %s", &k, m) != EOF)    {        char *r = m;        int count = 1;        while (strlen(r) < k)        {            r = multiply(r, m);            count++;        }        r = r + strlen(r) - k;        while (*r != '7')        {            r = multiply(r, m);            r = r + strlen(r) - k;            count++;        }        printf("%d\n", count);    }    return 0;}


0 0
原创粉丝点击