POJ1001:高精度乘法(去掉前导后导0,结果是整数不输出小数点)
#include<string.h>
#include<stdio.h>
const int maxn=999999;
char str[10];
int n,dot;
int res[maxn],a[maxn],b[maxn];
int len,lena,lenb;
void Mul()
{
int i,j;
memset(res,0,sizeof(res));//初始化结果
for(i=1;i<=lena;i++)
{
for(j=1;j<=lenb;j++)
{
res[i+j-1]+=a[i]*b[j];//怎么确定结果所在的位置下标?
if(res[i+j-1]>9)
{
res[i+j]+=res[i+j-1]/10;//进位
res[i+j-1]%=10;
}
}
}
if(res[lena+lenb-1]>9)
{
res[lena+lenb]+=res[lena+lenb-1]/10;
res[lena+lenb-1]%=10;
}
lena=lena+lenb;
for(i=1;i<=lena;i++) a[i]=res[i];
}
int main()
{
int i,j,up,down;//丿up和down是记录什么的
while(scanf("%s %d",str,&n)!=EOF)
{
dot =-1;//小数点初始化
for(i=5,j=1;i>=0;i--) //循环的意思 ?
{
if(str[i]!='.') a[j]=b[j++]=str[i]-'0';
else
dot = i;
}
if(dot==-1) lena = lenb = 6;//即输入为整数
else lena = lenb = 5;
for ( i=1;i<n;i++) Mul();
if ( dot == -1)
{
for(i=lena;i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
else
{
dot = 5 - dot ;
dot *= n;
for (i=1;i<=lena;i++)
{
if(a[i]!=0)
{
down = i;
break;
}
}
for (j=lena;j>=1;j--)
{
if(a[j]!=0)
{
up = j;
break;
}
}
i = up;
if(up<dot) i=dot;
j=down;
if(j>dot) j=dot + 1;
for(;i>=j;i--)
{
if(i==dot) printf(".");
printf("%d",a[i]);
}
printf("\n");
}
}
return 0;
}
自己是写不出..高精度(乘法)一直是个坎,还是Poj上去就有的一个坎,所以自己就在这个坑里一直转转停停,刷题也止住了。若不是队友督促,也许自己连分析别人的代码的时间都“没有”吧。写到这里还没有完全懂。等明天看别的题的时候再返回来看几遍这个。说没时间是假的,除了上课、复习数学&&背单词&&看日语&&运动&&偶尔扒扒MOOC,剩下的时间都花在刷淘宝、睡觉和吃饭上了吧。悠悠转转的把时间都浪费掉,然后坦荡的告诉自己没时间,其实还是什么都不会,尤其在编程算法能力上。...倒腾了许多,真的学会什么呢。踏实些。跟着踏实的人好好学。

浙公网安备 33010602011771号