您的位置:首页 > 其它

poj 1001

2012-02-13 15:47 204 查看
没有做最后的整理了、、、、
#include "stdio.h"
#include "string.h"

struct Bignum{
int s[3000];  //数组
int len;  //长度
int point;    //小数点位数
Bignum()
{
len = 1;
point = 0;
memset(s, 0, sizeof(s));
}

Bignum operator = (const char* num)
{
len = strlen(num);
int flag = 0;
int j;
point = 0;
for(int i=0,j=len-1; j>=0; j--)
{
if(num[j] !=  '.')
{
s[i++] = num[j]-'0';
if(flag==0)
{
point++;
}
} else {
flag = 1;
}
}
if(flag)
{
len--;
}
return *this;
}

Bignum operator * (const Bignum& b) const
{
Bignum c;
c.point = point + b.point;
int i,j;
for(i=0; i<len; i++)
{
for(j=0; j<b.len; j++)
{
c.s[i+j] = c.s[i+j] + s[i]*b.s[j];
}
}
int g;
for(c.len=0,g=0; g!=0 || c.len<(len+b.len); c.len++)
{
c.s[c.len] = c.s[c.len] + g;
g = c.s[c.len]/10;
c.s[c.len] = c.s[c.len]%10;
}
c.clear();
return c;
}

void clear()
{
/**
* 把数字前面和后面的0去掉
*/
//printf("(1)len:%d\n(1)point:%d\n", len, point);
int old_len=len, old_point=point, i;
len = 0;
//去掉小数点后面的零
for(i=0; i<old_len && i<old_point; i++)
{
if(s[i]!=0) {
break;
}
point--;
} //for i
for(; i<old_len; i++) {
s[len++] = s[i];
}  //for

//printf("len:%d\npoint:%d\n", len, point);

//去掉整数前面零
for(; len>0; len--)
{
if(s[len-1]!=0)
{
break;
}
} //for
}

void print()
{
clear();
if(point>=len)
{
printf(".");
while(point>len) {
printf("0");
point--;
}
} //if
for(int i=len-1; i>=0; i--)
{
printf("%d", s[i]);
if(i==point && i!=0)
{
printf(".");
}
} //for
printf("\n");
}
};

int main()
{
freopen("D:\\in.txt", "r", stdin);
char a[100];
int b;
while(scanf("%s%d", a, &b)==2) {
//printf("b:%d\n", b);
Bignum c,d;
c = a;
d = a;
c.clear();
d.clear();
//d.print();

for(int i=1; i<b; i++)
{
d = d * c;
}
d.print();
}
return 0;
}


思路:

1、把数字存储在数字数组中。

2、主要是在小数点的处理上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: