1001

来源:互联网 发布:多益网络offer 编辑:程序博客网 时间:2024/03/28 20:08

I will post my answer to poj.org, though they are not best

 Exponentiation

 http://poj.org/problem?id=1001


#include <stdio.h>#include <stdlib.h>int main(int argc, char **argv){    int n = 0;    char input[100] = {0};    while (scanf("%s%d", input, &n) == 2)    {        if (n == 0)        {            printf("1\n");            continue;        }        char *p = input;        char *ch = NULL;        int g_len = 0;        while (*p)        {            if (*p == '.')                ch = p;            p++;            g_len++;        }        int n_int = (ch) ? ch - input : g_len;        n_int *=n;        if (ch)        {            p = ch + 1;            while (*p)            {                *(p -1) = *p;                p++;            }            *(p - 1) = 0;            g_len --;        }        char *ret1 = NULL;        char *ret2 = NULL;        int max_len = 0;        max_len = g_len * n;        ret1 = malloc(sizeof(char) * max_len);        ret2 = malloc(sizeof(char) * max_len);        int i = 0;        for (i = 0; i < max_len; i++)            ret1[i] = 0;        p = input;        ch = ret1;        while(*p)        {            *p = *p - '0';            *(ch++) = *p;            p++;        }        int curlen = g_len;        for (i = 1; i < n; i++)        {            int j = 0;            for (j = 0; j < curlen + g_len; j++)                ret2[j] = 0;            int start = g_len;            for (j = g_len - 1; j >= 0; j--)            {                int k = 0;                for (k = 0; k < input[j]; k++)                {                    int q = 0;                    for (q = start + curlen - 1; q >= start; q--)                    {                        *(ret2 + q) += *(ret1 + q - start);                        if (*(ret2 + q) >= 10)                        {                            *(ret2 + q) -= 10;                            *(ret2 + q - 1) += 1;                        }                    }                }                start--;            }            for (j = 0; j < curlen + g_len; j++)                ret1[j] = ret2[j];            curlen += g_len;        }        i = 0;        int end = curlen - 1;        while (ret1[i] == 0 && i < n_int)            i++;        while (i < n_int)            printf("%d", ret1[i++]);        while (ret1[end] == 0 && end >= n_int)            end--;        if (end >= n_int)            printf("%c", '.');        for (i = n_int; i <= end; i++)        {            printf("%d", ret1[i]);        }        printf("\n");        free(ret1);        free(ret2);    }    return 0;}


原创粉丝点击