POJ1001 高精度乘法
2016-02-03 18:18
375 查看
</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;
}
#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;
}
相关文章推荐
- EasyMock 使用方法与原理剖析
- 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
- 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
- 百度地图再次签名报230错误
- 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
- uwsgi+nginx+web.py备忘
- TBB之Timing
- 漫游Kafka设计篇之数据持久化
- keepalived+LVS 实现双机热备、负载均衡、失效转移 高性能 高可用 高伸缩性 服务器集群
- quick实现虚拟摇杆
- grafana安装,与zabbix结合使用监控mysql
- hdu 1698 Just a Hook(线段树区间覆盖)
- 广西首届网络安全选拔赛 WEB Writeup
- 收藏5
- virgo tomcat下载
- CURLOPT_HEADER 不可小觑的作用
- MySQL 机制图、innodb存储引擎图
- openwrt 配置网桥 vlan 多个wan口 以及web界面配置总结
- Android 使用自定义Marker 在谷歌地图API
- [ 转] [Android]多式样ProgressBar