| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2204 人关注过本帖, 1 人收藏
标题:高精度小数乘方
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏(1)
已结贴  问题点数:20 回复次数:7 
高精度小数乘方
题目:求一个小数的n次方
数据:
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
输出:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

思路:先将小数化为整数,先对整数求乘方,然后加上小数点

现在代码写好了,样例和自己的数据都过了,但是交上去wrong Answer,不知什么原因,请各位多出些BT数据,或指出我还有什么情况没有考虑到

有这几种情况都考虑到了:
1.前需要补0 (如数据2)
2.后需要去0 (如最后一个数据) 比如 1.0 10  应输出1  如果没有处理会打印:"1.0000000000"
3.整数情况  (比如 9 9)9的9次方 应输出"387420489"
4.如果结果为整数需要去掉小数点 比如 1.0 10  应输出1 若没有处理会打印:"1."

代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sum[10000];
int t[10000];
void amass(int a[],int b[],int a_length,int b_length)
{
int i,j,temp;
for(i=0;i<a_length;i++)
{
temp=0;
for(j=0;j<b_length;j++)
{
temp=a[i]*b[j]+temp/10+t[i+j];
t[i+j]=temp%10;
}
t[i+j]=temp/10;
}
}
int main()
{
    char temp[1000];
    int temp1[10000];
    int number[1000];
    int i,j,n,len,now,sum_length,pos;
    memset(temp,0,sizeof(temp));
    while(scanf("%s",temp)!=EOF)
    {
    now=0;
    memset(number,0,sizeof(number));
    memset(sum,0,sizeof(sum));
    memset(t,0,sizeof(t));
    scanf("%d",&n);
    if(n==1)
    {
    printf("%s\n",temp);
    continue;
    }
    if(n==0)
    {
    printf("1\n");
    continue;
    }
    len=strlen(temp);
    for(i=0;i<len;i++)
    if(temp[i]=='.')//删除.
    {
    for(j=i;j<len;j++)
    temp[j]=temp[j+1];
    now=i;
    break;
    }
    strrev(temp);
    if(now!=0)//如果now不等于0 说明有小数点
    {
    len--;
    for(i=0;i<len;i++)
    number[i]=temp[i]-48;
    now=len-now;
    }
    else//否则没有小数点
    {
    for(i=0;i<len;i++)
    number[i]=temp[i]-48;
    now=0;
    }
    amass(number,number,len,len);
    sum_length=len+len;
    while(t[sum_length]==0&&sum_length>0)
    sum_length--;
    for(j=0;j<=sum_length;j++)
    sum[j]=t[j];
    for(i=2;i<n;i++)
    {
    memset(t,0,sizeof(t));
    amass(number,sum,len,sum_length+1);
    sum_length=len+sum_length;
    while(t[sum_length]==0&&sum_length>0)
    sum_length--;
    for(j=0;j<=sum_length;j++) sum[j]=t[j];
    }
    if(now==0)
    {
    for(i=sum_length;i>=0;i--)
    printf("%d",sum[i]);
    printf("\n");
    }
    else
    {
    pos=now*n;
    if(pos<=sum_length)
    {
    for(i=0;i<=sum_length;i++)
    {
    if(i==pos)
    {
    temp1[i]=-1;
    break;
    }
    else
    temp1[i]=sum[i];
    }
    pos=i;
    for(j=i;j<=sum_length;j++)
    temp1[++pos]=sum[j];
    pos=0;
    for(i=0;i<=sum_length+1;i++)
    if(temp1[i]==0)
    pos++;
    else
    break;
    if(temp1[i]==-1)
    pos++;
    for(i=sum_length+1;i>=pos;i--)
    {
    if(temp1[i]!=-1)
    printf("%d",temp1[i]);
    else
    printf(".");
    }
    printf("\n");
    }
    else
    {
    printf(".");
    for(i=0;i<pos-sum_length-1;i++)
    printf("0");
    for(i=0;i<=sum_length;i++)
    temp1[i]=sum[i];
    pos=i;
    for(j=i;j<=sum_length;j++)
    temp1[++pos]=sum[j];
    pos=0;
    for(i=0;i<=sum_length+1;i++)
    if(temp1[i]==0)
    pos++;
    else
    break;
    for(i=sum_length;i>=pos;i--)
    printf("%d",temp1[i]);
    printf("\n");
    }
    }
    memset(temp,0,sizeof(temp));
    memset(temp1,0,sizeof(temp1));
    }
    //system("pause");
    return 0;
}



[ 本帖最后由 sunyh1999 于 2011-7-28 12:48 编辑 ]
搜索更多相关主题的帖子: 小数点 
2011-07-28 12:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:20 
北大OJ的1001吧  花了2天时间过了 不过有点乱 可读性很差
程序代码:
#include <stdio.h>
#include <string.h>
struct BigInt
{
    char bit[500];
    bool flag;
    int nbit;
};
void InPut(BigInt *p)
{
    if(p->bit[0] == '-')
        p->flag = 1;
    p->nbit = strlen(p->bit);
    int i,j,k;
    int len = p->nbit;
    i = 0;j = len-1;
    while(i<=j)
    {
        char temp = p->bit[i]-48;
        p->bit[i] = p->bit[j]-48;
        p->bit[j] = temp;
        i++;j--;
    }
    if(p->flag)
        p->bit[len-1] = 0;
    for(i = len-1;i>=0;i--)
        if(p->bit[i]>0 && p->bit[i]<=9)
            break;
    p->nbit = i+1;
}
void Multip(const BigInt a,const BigInt b,BigInt *res)
{
    if(a.flag == b.flag)
        res->flag = 0;
    int i = 0,j = 0,k = 0,low = 0;   
    while(i<b.nbit)
    {
        low = 0;
        while(j<a.nbit)
        {
            char num = low+a.bit[j]*b.bit[i];
            k = i+j;
            res->bit[k] += num%10;
            low = num/10;
            low += res->bit[k]/10;
            res->bit[k] %= 10;
            j++;
        }
        if(low)
            res->bit[i+j] += low;
        k = i+j;
        i++;j = 0;
    }
    if(low)
        res->nbit = k+1;
    else
        res->nbit = k;
}
int main()
{
    BigInt b1 = {0},b2 = {0},b3 = {0};
    int n = 0;
    int i,j,k;
/*
    strcpy(b1.bit,"860709538625867");
    strcpy(b2.bit,"95123");
    InPut(&b1);
    InPut(&b2);
    Multip(b1,b2,&b3);
*/
    while(EOF != scanf("%s %d",b1.bit,&n))
    {
        j = 0;
        int pos = 0;
        if(n == 0)
        {
            printf("1\n");
            continue;
        }
        if(b1.bit[0] != '.')
        {

            for(i = 0;b1.bit[i];i++)
            {
                  if(b1.bit[i] != '.')
                {
                    b1.bit[j++] = b1.bit[i];
                }
                else
                    pos = i;
            }       
            b1.bit[j] = '\0';
            if(pos)
                pos = strlen(b1.bit+pos);
            pos *= n;
        }
        else
        {
            pos = strlen(b1.bit+1);
            pos *= n;
            for(i = 0;b1.bit[i];i++)
            {
                  if(b1.bit[i] != '.')
                {
                    b1.bit[j++] = b1.bit[i];
                }
            }       
            b1.bit[j] = '\0';
        }
        InPut(&b1);
        b2 = b1;
        b3 = b2;
        while(n>1)
        {
            memset(&b3,0,sizeof(BigInt));
            Multip(b2,b1,&b3);
            b2 = b3;           
            n--;
        }
        i = b3.nbit-1>pos-1 ? b3.nbit-1:pos-1;
        for(j = 0;j<pos;j++)
            if(b3.bit[j])
                break;
        if(i<j)
        {
            printf("0\n");
            continue;
        }
        while(i>=j)
        {
            if(i+1 == pos)
                putchar('.');
            putchar(b3.bit[i--]+48);
        }
        printf("\n");
    }
    return 0;
}

                                         
===========深入<----------------->浅出============
2011-07-28 15:00
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
一会我会把我这几天做的大整数运算类发来

老杨能力有限  BUG在所难免  大家帮我测试

                                         
===========深入<----------------->浅出============
2011-07-28 15:14
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
好的

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-07-28 16:49
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
发现一个错误,然后改正了以后还是WA:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sum[10000];
int t[10000];
void amass(int a[],int b[],int a_length,int b_length)
{
int i,j,temp;
for(i=0;i<a_length;i++)
{
temp=0;
for(j=0;j<b_length;j++)
{
temp=a[i]*b[j]+temp/10+t[i+j];
t[i+j]=temp%10;
}
t[i+j]=temp/10;
}
}
int main()
{
    char temp[1000];
    int temp1[10000];
    int number[1000];
    int i,j,n,len,now,sum_length,pos;
    memset(temp,0,sizeof(temp));
    while(scanf("%s",temp)!=EOF)
    {
    now=0;
    memset(number,0,sizeof(number));
    memset(sum,0,sizeof(sum));
    memset(t,0,sizeof(t));
    scanf("%d",&n);
    if(n==1)
    {
    pos=0;
    strrev(temp);
    for(i=0;i<strlen(temp);i++)
    if(temp[i]=='0')
    pos++;
    else
    break;
    if(temp[i]=='.')
    pos++;
    for(i=strlen(temp)-1;i>=pos;i--)
    printf("%c",temp[i]);
    //printf("%s\n",temp);
    printf("\n");
    continue;
    }
    if(n==0)
    {
    printf("1\n");
    continue;
    }
    len=strlen(temp);
    for(i=0;i<len;i++)
    if(temp[i]=='.')//删除.
    {
    for(j=i;j<len;j++)
    temp[j]=temp[j+1];
    now=i;
    break;
    }
    strrev(temp);
    if(now!=0)//如果now不等于0 说明有小数点
    {
    len--;
    for(i=0;i<len;i++)
    number[i]=temp[i]-48;
    now=len-now;
    }
    else//否则没有小数点
    {
    for(i=0;i<len;i++)
    number[i]=temp[i]-48;
    now=0;
    }
    amass(number,number,len,len);
    sum_length=len+len;
    while(t[sum_length]==0&&sum_length>0)
    sum_length--;
    for(j=0;j<=sum_length;j++)
    sum[j]=t[j];
    for(i=2;i<n;i++)
    {
    memset(t,0,sizeof(t));
    amass(number,sum,len,sum_length+1);
    sum_length=len+sum_length;
    while(t[sum_length]==0&&sum_length>0)
    sum_length--;
    for(j=0;j<=sum_length;j++) sum[j]=t[j];
    }
    if(now==0)
    {
    for(i=sum_length;i>=0;i--)
    printf("%d",sum[i]);
    printf("\n");
    }
    else
    {
    pos=now*n;
    if(pos<=sum_length)
    {
    for(i=0;i<=sum_length;i++)
    {
    if(i==pos)
    {
    temp1[i]=-1;
    break;
    }
    else
    temp1[i]=sum[i];
    }
    pos=i;
    for(j=i;j<=sum_length;j++)
    temp1[++pos]=sum[j];
    pos=0;
    for(i=0;i<=sum_length+1;i++)
    if(temp1[i]==0)
    pos++;
    else
    break;
    if(temp1[i]==-1)
    pos++;
    for(i=sum_length+1;i>=pos;i--)
    {
    if(temp1[i]!=-1)
    printf("%d",temp1[i]);
    else
    printf(".");
    }
    printf("\n");
    }
    else
    {
    printf(".");
    for(i=0;i<pos-sum_length-1;i++)
    printf("0");
    for(i=0;i<=sum_length;i++)
    temp1[i]=sum[i];
    pos=i;
    for(j=i;j<=sum_length;j++)
    temp1[++pos]=sum[j];
    pos=0;
    for(i=0;i<=sum_length+1;i++)
    if(temp1[i]==0)
    pos++;
    else
    break;
    for(i=sum_length;i>=pos;i--)
    printf("%d",temp1[i]);
    printf("\n");
    }
    }
    memset(temp,0,sizeof(temp));
    memset(temp1,0,sizeof(temp1));
    }
    //system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-07-28 16:50
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
用函数模块写了之后 想写成类 然后把操作以运算符重载的形式给出

但是结果是错误的  今天没时间了 等明天  是在搞不了运算符重载

那就函数了  楼主如果有兴趣 就把它做成类  不过会很纠结  我全部用的是指针

test.rar (2.26 KB)


[ 本帖最后由 laoyang103 于 2011-7-28 18:25 编辑 ]

                                         
===========深入<----------------->浅出============
2011-07-28 18:22
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个程序POJ的过了,hdu的过不了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-07-28 18:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
题目不一样吧

                                         
===========深入<----------------->浅出============
2011-07-29 09:07
快速回复:高精度小数乘方
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020507 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved