这题,对我锻炼意义挺大的。
在知道多位乘法的算法的情况下,如何将其转换成代码
还要按照要求,排除各种特殊情况
特殊情况:
00.000 1
1.2525 0
10.000 1
#include<stdio.h>
#include<string.h>
#define M 1000
int num[8][1000],mum[8],ans[1000];
void main()
{
int i,j,ii,k,m,n,place,d,kk,kkk,flag;
int x;
char s[6];
x=5;
while(scanf("%s%d",&s,&n)!=EOF)
{
if(n==0) //如果n为0,即0次方,则输出1
{
printf("1\n");
continue;
}
x=5; //默认为5位数字
k=0;
//数组清零
for(i=0;i<M;i++)
{
ans[i]=0;
for(j=0;j<8;j++)
num[j][i]=0;
}
flag=1;
for(i=x;i>=0;i--)
{
if(s[i]!='.')
{
ans[k]=mum[k]=s[i]-'0'; //将5位数组赋值
if(flag==1) //如果小数点与非0数前,存在0,则舍去,同时总位数-1
{
if(ans[k]==0)
{x--;continue;}
else flag=0;
}
k++;
}
else
{
place=x-i; //确定小数点位置
flag=0;
}
}
//如果位数为0,说明是0,输出0
if(x==0)
{
printf("0\n");
continue;
}
for(i=0;i<n-1;i++) //开n次方,那么要乘n-1次原数字
{
//得到数组num[0][]到num[5][]
kk=0;
for(j=0;j<x;j++)
{
d=0;
for(ii=0;ii<k;ii++)
{
if(ii<kk)
{
num[j][ii]=0;
continue;
}
num[j][ii]=d; //这里是用手算多位乘法的方法,得到的代码
d=ans[ii-kk]*mum[j];
num[j][ii]+=d;
d=num[j][ii]/10;
num[j][ii]=num[j][ii]%10;
}
num[j][k]=d;
kk++; //平移数,也就是手算乘法时那行的右移数
k++; //位数+1
}
d=0; //相加所有num,得到最终结果ans
for(ii=0;ii<k;ii++)
{
ans[ii]=d;
for(j=0;j<x;j++)
ans[ii]+=num[j][ii];
d=ans[ii]/10;
ans[ii]=ans[ii]%10;
}
ans[k]=d;
}
place=place*n; //确定最终小数点位置
flag=1;
for(j=k;j>=0;j--)
{
if(j>place-1&&flag==1) //排除小数点和非整数前的‘0’
{
if(ans[j]==0)
continue;
else
flag=0;
}
if(j==place-1)
printf(".");
printf("%d",ans[j]);
}
printf("\n");
}
}