您的位置:首页 > 其它

POJ 1001 Exponentiation

2013-11-29 14:15 459 查看
就是小数的高精度冥。

我是字符串输入。去掉前导0和后面的0;

例如 3.0100

用dian去记录小数点的位; 2

用字符串tmp去存去掉小数点后,倒过来的数; 103

然后用个tmp1去存 int型的 数; 301

然后计算输出,最后注意小数点的位置。

额。代码有点繁琐。不过AC了。


#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
void powfff(char *str,int n)
{
    char tmp[10001];
    int i=0,k,j=0,dian=0,tmp1=0;
    bool flag=0;
    j=strlen(str);
    for(j--;str[j]=='0';j--);str[j+1]='\0';
    for(i=j;str[i]!='.';i--)dian++;
    for(i=k=0;i<=j+1;i++)
    {
        if(!flag&&str[i]=='0'||str[i]=='.')continue;
        if(str[i]!='0')flag=1;
        if(flag)str[k++]=str[i];
    }
    int c=0,s,len=strlen(str);
    for(i=k=0;i<len;i++)
    {
        tmp1=tmp1*10+str[i]-'0';
        tmp[k++]=str[len-1-i];
    }tmp[k]='\0';
    dian=dian*n;
    while(n-->1)
    {
        for(i=0;i<len;i++)
        {
            s=c+(tmp[i]-'0')*tmp1;
            tmp[i]=s%10+'0';
            c=s/10;
        }
        while(c>0)
        {
            tmp[i++]=c%10+'0';
            c/=10;
        }
        len=i;
    }
    //tmp[len]='\0';
    //puts(tmp);printf("%d %d %d\n",len,dian,tmp1);
    if(len<=dian)
    {
        printf(".");
        for(k=dian-len;k>0;k--)
        printf("0");
        for(i=len-1;i>=0;i--)
        printf("%c",tmp[i]);
        printf("\n");
    }
    else
    {
        dian=len-dian;
        for(i=len-1;i>=0;dian--)
        {
            if(dian==0)printf(".");
            else printf("%c",tmp[i--]);
        }
        printf("\n");
    }

}
int main()
{
    char str[21];
    int n;
    while(~scanf("%s%d",str,&n))
    {
        powfff(str,n);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: