POJ 1001 求高精度幂
2016-07-28 15:51
375 查看
高精度问题 初学的时候觉得很恶心。
去掉小数点,原数组存在另一个数组,将小数点标记。
用中间数组进行存储,模仿笔算乘法
去掉前导0 后导0 用up down
<pre name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAX 26*5
char str[6];
int res[MAX],a[MAX],b[MAX];
int n,dot;
int lena,lenb;
void mul()
{
memset(res,0,sizeof(res));
for(int i=1; i<=lena; i++)
for(int 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;
}
}
lena=lena+lenb;
for(int i=1; i<=lena; i++)
a[i]=res[i];
}
int main()
{
//freopen("in.txt","r",stdin);
int down,up;
while(scanf("%s %d",str,&n)!=EOF)
{
dot=-1;
for(int 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(int i=1; i<n; i++) mul();
if(dot==-1)
{
for(int i=lena; i>0; i--)
printf("%d",a[i]);
printf("\n");
}
else
{
dot =5-dot;
dot *=n;
for(int i=1; i<=lena; i++)
if(a[i]!=0)
{
down=i;
break;
}
for(int j=lena; j>0; j--)
{
if(a[j]!=0)
{
up=j;
break;
}
}
int i=up;
if(up<dot)
i=dot;
int j=down;
if(down>dot)
j=dot+1;
for(; i>=j; i--)
{
if(i==dot)
printf(".");
printf("%d",a[i]);
}
}
printf("\n");
}
return 0;
}
去掉小数点,原数组存在另一个数组,将小数点标记。
用中间数组进行存储,模仿笔算乘法
去掉前导0 后导0 用up down
<pre name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAX 26*5
char str[6];
int res[MAX],a[MAX],b[MAX];
int n,dot;
int lena,lenb;
void mul()
{
memset(res,0,sizeof(res));
for(int i=1; i<=lena; i++)
for(int 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;
}
}
lena=lena+lenb;
for(int i=1; i<=lena; i++)
a[i]=res[i];
}
int main()
{
//freopen("in.txt","r",stdin);
int down,up;
while(scanf("%s %d",str,&n)!=EOF)
{
dot=-1;
for(int 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(int i=1; i<n; i++) mul();
if(dot==-1)
{
for(int i=lena; i>0; i--)
printf("%d",a[i]);
printf("\n");
}
else
{
dot =5-dot;
dot *=n;
for(int i=1; i<=lena; i++)
if(a[i]!=0)
{
down=i;
break;
}
for(int j=lena; j>0; j--)
{
if(a[j]!=0)
{
up=j;
break;
}
}
int i=up;
if(up<dot)
i=dot;
int j=down;
if(down>dot)
j=dot+1;
for(; i>=j; i--)
{
if(i==dot)
printf(".");
printf("%d",a[i]);
}
}
printf("\n");
}
return 0;
}
相关文章推荐
- 跳槽指南
- 文章标题
- 基于注解的spring mvc开发
- 子线程真的不能更新UI吗?
- Linux下source命令详解
- 异常解决:错误:namespace element 'annotation-config' … on JDK 1.5 and higher
- 十道海量数据处理面试题与十个方法大总结
- java常见进制数之间的转换
- 如何做一个基于ASP.NET MVC 网站(六)
- Inotify: 高效、实时的Linux文件系统事件监控框架
- 自定义alertDialog
- unity中gameobject如何添加线框网格
- hdu 2187 悼念512汶川大地震遇难同胞——老人是真饿了
- 微信支付对账单下载
- POJ 3620 Avoid The Lakes(连通分量,DFS)
- 【南阳acm】最少步数
- ref和out的原理及区别
- ActiveMQ的知识总结
- 数据库查询日期
- 如何在Mac系统上安装Tomcat