您的位置:首页 > 其它

POJ 1001 Exponentiation

2013-09-30 00:01 357 查看
这道题主要是要对数据进行大数据运算算。

大数据进行乘法运算的时候,假设为a[MAX,b[MAX]两个数据相乘,那么所得的结果可以用如下的公式表示:

c[i+j] = a[i]*b[j];

c[i+j+1] += c[i+j]/10;

c[i+j] = c[i+j]%10;

这道题目后面比较麻烦的一点是对数据格式化输出,特别要注意的几个数据是9.0 0.0 其他的感觉还好。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
void  mypow(string r,int n);void powi(int *a,int n1,int n2,int pw);
int main ()
{
string r ;
int n = 0;
int a[3]= {1,0,1};
while ((cin >> r >> n))
{
mypow(r,n);
}

}

void powi(int *a,int n1,int n2,int pw)
{
int bgsz = n2*(n1+1);
int *c = new int[bgsz];
int *b = new int[bgsz];
for (int i =n2*(n1+1); i >=0; i --) c[i] = 0;
for (int i = n1; i >=0; i --) b[i]= a[i];
for (int k =0; k < n2-1; k ++)
{
for (int i =0; i < n1+k*n1; i ++)
{
for (int j =0; j < n1; j ++)
{
c[i+j] += b[i]*a[j];
c[i+j+1] += c[i+j]/10;
c[i+j] = c[i+j]%10;
}
}
for (int i =n2*(n1+1); i >=0; i --)
{
b[i] = c[i],c[i] =0;
}
}
int flag = 0;
int fstart = 0;
for (int i =0; i < bgsz-1; i ++)
{
if (b[i] >0 && fstart <0) fstart = i;
if (b[i]>0) flag = i;
}
if (pw<= flag)
for (int i = flag; i >= pw; i--) cout << b[i];
else{}
if(pw > fstart)
{
cout << '.';
for (int i = pw-1; i >= fstart; i --)
{
cout << b[i] ;
}
}
else
{
if (pw+fstart)
for (int i = pw; i>=0;i --) cout << b[i] ;
}
cout <<endl;

}
void mypow (string r,int n)
{
string::reverse_iterator it = r.rbegin();
int mout = 0;
while (it != r.rend()&&*it == '0' )
{
mout ++;
it ++;
}
r.erase(r.size()-mout,r.size());
int pt = r.find('.');
int pn = 0;
if(pt >0)
pn = (r.size()-pt-1)*n;
if (pt >=0)
{
r.erase(pt,1);
}
int *a = new int[r.size()];
int sz = r.size();
for (int i =0; i < sz; i ++)
{
a[i] = r[sz-i-1]-48;
}
powi(a,sz,n,pn);
delete a;
}


花了一下午写的,好久没有做题目了,脑袋秀逗了。代码很奇怪,编译之后,有时候能运行,有时候会出现死掉的情况,但是逻辑并没有什么问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: