这是一道关于高精度计算的题~
大致的思想是用数组储存各位~然后进行循环乘法运算~
将各位存贮到数组中时~
需要先将input读入字符串s中~再令a[i]=s[i]-48便可~PS~0的ASC码为48~
在进行乘法运算时~由于是循环的要记得把存贮数组c[]清零~
此外~还需注意一下几点~
1~input有可能小于6位~例如1.1~所以这一点要考虑到~不要固定某个数~
2~要注意output若为整数,不要输出小数点~例如~不要12.~应为12
3~output中后面和前面多余的0都要去掉~例如0.12~应为.12~12.100应为12.1~
大致就是这些~
#include"stdio.h"
#include"string.h"
int main()
{
int a[1000],
b[1000],
c[1000];
char s[10];
int point;
int n,m;
int x;
int i,
j;
int count;
int count2,count3;
// freopen("1001in.txt","r",stdin);
//freopen("1001out.txt","w",stdout);
while(scanf("%s %d",&s,&n)!=EOF)
{
x=strlen(s)-1; //有可能小于6
for(i=0,j=x-1;i<=x;i++)
{
if(s[i]<48)
point=x-i;
else
{
a[j]=b[j]=s[i]-48;
j--;
}
}
count=x-1;
m=n-1;
while(m--)
{
memset(c,0,1000); //记得将贮存数组清零
for(i=0;i<=count;i++)
for(j=0;j<=x-1;j++)
c[i+j]+=a[i]*b[j];
count+=x-1;
for(j=0;j<count;j++)
{
c[j+1]+=c[j]/10;
c[j]=c[j]%10;
}
if(c[count]/10!=0) //进行乘法运算的核心步骤
{
c[count+1]=c[count]/10;
c[count]=c[count]%10;
count++;
}
for(j=0;j<=count;j++)
a[j]=c[j];
}
for(j=0,count2=0;j<=point*n-1;j++) //去掉后面多余的0
if(a[j]==0)
count2++;
else
break;
for(j=count,count3=0;j>=point*n;j--) //去掉前面多余的0
if(a[j]==0)
count3++;
else
break;
for(j=count-count3;j>=point*n;j--)
printf("%d",a[j]);
if(count2!=n*point) //去掉整数后面的小数点
{
printf(".");
for(j=point*n-1;j>=count2;j--)
printf("%d",a[j]);
}
printf("\n");
}
}