首页 > 其他 > 详细

poj1001

时间:2014-03-25 07:42:53      阅读:348      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
#include <cstdio>
#include <cstring>
using namespace std;
#define eps 1e-8
#define D 150
void m(long long b[D], long long a[D])
{
    long long t[D << 1];
    memset(t, 0, sizeof(t));
    for(int i = 0; i < D; i++)
        for(int j = 0; j < D; j++)
        {
            t[i + j] += a[i] * b[j];
            t[i + j + 1] += t[i + j] / 10;
            t[i + j] %= 10; 
        }
    for(int i = 0; i < D; i++)
    {
        b[i] = t[i] % 10;
        t[i + 1] += t[i] / 10;
    }
}
void multi(long long a[D], int n)
{
    long long b[D];
    memset(b, 0, sizeof(b));
    b[0] = 1;
    while(n)
    {
        if(n & 1)
            m(b, a);
        n >>= 1;
        long long t[D];
        memcpy(t, a, sizeof(t));
        m(t, a);
        memcpy(a, t, sizeof(t));
    }
    memcpy(a, b, sizeof(b));
}
int main()
{
    double R;
    int n;
    while(scanf("%lf%d", &R, &n) == 2)
    {
        long long a[D];
        int pos, posn = 0;
        memset(a, 0, sizeof(a));
        R *= (pos = 100000);
        a[0] = (long long)(R + eps);
        while(a[0] % 10 == 0 && pos > 1)
        {
            a[0] /= 10;
            pos /= 10;
        }
        for(int i = 0; i < D - 1; i++)
        {
            a[i + 1] += a[i] / 10;
            a[i] %= 10;
        }
        while(pos > 1)
        {
            pos /= 10;
            posn++;
        }
        posn *= n;
        multi(a, n);
        pos = D - 1;
        while(a[pos] == 0 && pos >= posn)
            pos--;
        while(pos >= 0)
        {
            if(pos == posn - 1)
                printf(".");
            printf("%lld", a[pos--]);
        }
        printf("\n");
    }
    return 0;
}
bubuko.com,布布扣

poj1001,布布扣,bubuko.com

poj1001

原文:http://www.cnblogs.com/zxfx100/p/3622264.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!