我叫张小黑
张小黑的挣扎生活
posts - 66,  comments - 109,  trackbacks - 0
本来都打定主意叫它几十次,这道题考虑了很多细节,想了很多边界条件,一次交过了还是没想到的
我也不知道这道题到底要不要考虑那些边界条件,不过看交过的比例,要注意的肯定很多,也许还有应该要想到的
这是第一次作实数的高精度,写的很乱,很多都是发现问题后不上去的
  1#include<iostream>
  2using namespace std;
  3#define Max 200
  4#define Max_b 7
  5typedef struct bigint{
  6    int data[Max];//从0开始存储
  7    int len;
  8    int i;//表示小数位
  9    bigint()
 10    {
 11        memset(data,0,sizeof(data));
 12        len=1;
 13        i=0;
 14    }
 15    friend bigint operator+(bigint,bigint);
 16    friend bigint operator*(bigint,bigint);
 17    void print();//小数点在第i位上,后面有i个小数位
 18    void operator=(const bigint&y){
 19        len=y.len;
 20        for(int j=0;j<y.len;j++)
 21            data[j]=y.data[j];
 22        i=y.i;
 23    }
 24}BIGINT;
 25BIGINT operator+(BIGINT x,BIGINT y)
 26{
 27    BIGINT r;
 28    int rlen=x.len>y.len?x.len:y.len;
 29    int tmp,i,jinwei=0;
 30    for(i=0;i<rlen;i++){
 31        tmp=x.data[i]+y.data[i]+jinwei;
 32        r.data[i]=tmp%10;
 33        jinwei=tmp/10;}
 34    if(jinwei)r.data[rlen++]=jinwei;
 35    r.len=rlen;
 36    return r;
 37}
 38BIGINT operator*(BIGINT x,BIGINT y)
 39{
 40   BIGINT  r;
 41   int i,j;
 42   memset(r.data,0,sizeof(r.data));
 43   r.len=x.len+y.len;
 44   for(i=0;i<x.len;i++)
 45       for(j=0;j<y.len;j++)
 46           r.data[i+j]+=x.data[i]*y.data[j];
 47   for(i=0;i<r.len;i++){
 48       r.data[i+1]+=r.data[i]/10;
 49       r.data[i]%=10;}
 50   while(r.data[i]){
 51       r.data[i+1]+=r.data[i];
 52       r.data[i]%=10;
 53       i++;}
 54   while(i>=0&&!r.data[i])i--;//这个已经消除了开头的零
 55   //末尾不存在零,不用考虑
 56   if(i!=-1)r.len=i+1;
 57   else r.len=1;//r为0的情况
 58   r.i=x.i+y.i;
 59   return r;
 60}
 61void BIGINT::print()
 62{
 63    int j,k;
 64    for(j=this->len-1;j>=this->i;j--)//输出了len-i个或是一个也还没输出
 65        printf("%d",this->data[j]);
 66    if(j==-1){
 67        putchar('\n');
 68        return;}
 69    putchar('.');
 70    if(j<this->i)//小数点后要补零
 71        for(k=this->i-1;k>j;k--)
 72            putchar('0');
 73    for(;j>=0;j--)
 74        printf("%d",this->data[j]);
 75    putchar('\n');
 76}
 77BIGINT cToBigint(char c[])
 78{
 79    int clen=(int)strlen(c),i=0,j=clen-1,k;
 80    BIGINT result;
 81    memset(result.data,0,sizeof(result.data));
 82    while(c[i]=='0'&&i<clen-1)i++;
 83    while(c[j]=='0'&&j>=0)j--;
 84    if(j>i){
 85        result.len=j-i;
 86        for(j=result.len-1;c[i]!='.';j--,i++)
 87            result.data[j]=c[i]-'0';
 88        result.i=j+1;
 89        for(i++;j>=0;j--,i++)
 90            result.data[j]=c[i]-'0';}
 91    else if(j<i){//
 92        result.len=1;
 93        result.i=0;}
 94    else if(i==j&&c[i]!='.'){//完全就是整数,没有小数点
 95        for(j=clen-1,k=0;j>=i;j--,k++)
 96            result.data[k]=c[j]-'0';
 97        result.len=k;
 98        result.i=0;
 99    }
100    return result;
101}
102int main()
103{
104    BIGINT R,result;
105    int n,i;
106    char c[Max_b];
107    while(scanf("%s %d",c,&n)!=EOF){
108        memset(result.data,0,sizeof(result.data));
109        result.i=0;
110        result.len=1;
111        R=cToBigint(c);
112        result.data[0]=1;
113        for(i=1;i<=n;i++)
114            result=result*R;
115        result.print();
116    }
117    return 0;
118}

posted on 2008-03-09 14:00 zoyi 阅读(535) 评论(0)  编辑 收藏 引用 所属分类: acm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


欢迎光临 我的白菜菜园

<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

相册

acmer

online judge

队友

技术

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜