</pre>http://blog.csdn.net/alongela/article/details/6788237http://blog.csdn.net/alongela/article/details/6788237</p><p> 在做1001的时候,看了上面这位大神的博客。但是发现这位大神的思路是对的,但是代码是无法通过的。因此分享下在这位大神的代码基础上修改的能AC的代码。纯属分享,如涉及侵权请联系我,我会立即删掉。</p><p></p><p><pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
char str[10];
int n,dot;
int res[200],a[200],b[10];
int len,lena,lenb;
//处理大数相乘
void mul()
{
int i,j;
memset(res,0,sizeof(res));
for(j=1;j<=lenb;j++)
{
for(i=1;i<=lena;i++)
{
res[i+j-1]+=a[i]*b[j];
}
}
len=lena+lenb;
for(int k=1;k<len;k++)
{
if(res[k]>9)
{
res[k+1]+=res[k]/10;
res[k]%=10;
}
}
if(res[len]==0)
len--;
lena=len;
for(i=1;i<=lena;i++)
a[i]=res[i];
}
int main()
{
int i,j,up,down;
while(scanf("%s%d",str,&n)!=EOF)
{
//处理输入
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
dot=-1;
for(i=5,j=1;i>=0;i--)
{
if(str[i]!='.') {a[j]=b[j]=str[i]-'0';j++;}
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;
}
}
if(i==lena+1)
{
printf("0\n");
continue;
}
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;
}
POJ1001 高精度乘法
猜你喜欢
转载自blog.csdn.net/IT_boy_Jason/article/details/50630769
今日推荐
周排行