原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155
描述:
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。
现在要你解决的问题是:对一个实数R( 0.0< R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < =n< = 25。
在该过程中遇到的问题:
我的思路是先不考虑小数,先进行整数的计算,然后在输出的时候再考虑小数点的位置,但在最后的结果上出现了问题,那就是对与大于1的小数的计算,结果是正确的,
但对于小于1的小数,在输出时,就只会从小数点后第一个不为0的数字处输出
代码:
#include <stdio.h>
#include <string.h>
char a[50];
int b[100],c[100],n;
int result[100];
void init(){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
}
void create(){
int i,j;
for(i=strlen(a)-1,j=0;i>=0;i--,j++){
if(a[i]!='.'){
b[j]=a[i]-'0';
c[j]=a[i]-'0';
}else
j--;
}
}
int len(int a[]){
int i=99;
while(a[i]==0&&i>=0)
i--;
return i;
}
void jisuan(){
memset(result,0,sizeof(result));
int i,j,k=0,s,v=0;
for(i=0;i<=len(b);i++)
for(j=0;j<=len(c);j++){
s=b[i]*c[j];
//printf("====%d",s);
result[i+j]+=s;
}
for(i=0;i<sizeof(result);i++){
c[i]=(result[i]+v)%10;
v=(result[i]+v)/10;
}}
void shuchu(int num[100],int dian,int sum){
int i=99,j;
// printf("==%d\n",sum);
while(num[i]==0&&i>=0)
i--;
if(i<0)
printf("0\n");
else{
/* if(num[0]==0){
int yu=0;
while(num[yu]==0&&yu<len(num))
yu++;
}*/
// printf("====%d",i+1);
// else{
for(j=i+1;j--;j>=0){
printf("%d",num[j]);
if(dian != -1 && j == sum){
// printf("===%d\n",i+2-j);
printf(".");
}
}
printf("\n");
}
}
int main(){
int i,k,dian=0;
while(scanf("%s %d",&a,&n)!=EOF){
if(strchr(a,'.')){
dian=strlen(a)-(strchr(a,'.')-a)-1;
}else
dian=-1;
int sum=dian*n;
//printf("%d==%d===%d",dian,n,dian*n);
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
create();
// shuchu(b);
/*for(i=0;i<strlen(a);i++)
printf("%d",b[i]);*/
while(n-1){
jisuan();
n--;
}
shuchu(c,dian,sum);
}
return 0;
}
希望发现错误的大神可以帮我解决一下我的问题