POJ1001-烦死人的模拟

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;

char s[12];
int n;
int a[10000];

void mult(int a[],int &k,int x)
{
    int jw=0;
    for (int i=0; i<k; i++)
    {
        a[i]=a[i]*x+jw;
        jw=a[i]/10;
        a[i]%=10;
    }
    while (jw) { a[k++]=jw%10; jw/=10; }
}

int main()
{
    while (cin>>s>>n)
    {
        int t=0;
        int x,y;
        x=0;
        for (int i=0; s[i]; i++)
        {
            if (s[i]=='.') t=strlen(s)-i-1;    //计算小数点位置
            else           x=x*10+s[i]-'0';
        }
        if (x==0) { printf("0\n"); continue; } //1:底数为0
        if (n==0) { printf("1\n"); continue; } //2:指数为0
        y=x;
        int k=0;
        while (y>0)
        {
            a[k++]=y%10;
            y/=10;
        }
        for (int i=1; i<n; i++) mult(a,k,x);  //高精度乘法

        int p=0;
        while (a[p]==0 && p<t*n) p++;         //p解决小数后面缀余的零,砍点的p不可越过小数点(即应小于t*n)!
        if (t*n>=k)                           //如果结果介于0~1之间
        {
            printf(".");
            for (int i=k; i<t*n; i++) printf("0");
        }
        for (int i=k-1; i>=p; i--)
        {
            printf("%d",a[i]);
            if (i==t*n && i>p) printf(".");
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(include)