| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2204 人关注过本帖, 1 人收藏
标题:高精度小数乘方
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏(1)
已结贴  问题点数:20 回复次数:3 
高精度小数乘方
题目:求一个小数的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
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
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个程序POJ的过了,hdu的过不了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-07-28 18:47
快速回复:高精度小数乘方
数据加载中...
 
   



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

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