心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
压4位。
以下是我的代码:
#include<stdio.h>
#include
<string.h>
#define maxlen 10010
typedef unsigned 
long Long;
typedef 
struct
{
    Long len,s[
10000];
}
high;
char s1[maxlen],s2[maxlen];
high a,b,c;
Long num(
char s[],Long begin,Long end)
{
    
long i,re=0;
    i
=begin;
    
while(i<end)
    
{
       re
+=s[i]-'0';
       re
*=10;
       i
++;
    }

    re
+=s[end]-'0';
    
return re;
}

void init()
{
    
long i,l1,l2;
    a.len
=0;
    b.len
=0;
    c.len
=0;
    
for(i=0;i<10000;i++)
    
{
       a.s[i]
=0;
       b.s[i]
=0;
       c.s[i]
=0;
    }

    scanf(
"%s%s",s1,s2);
    l1
=strlen(s1)-1;
    l2
=strlen(s2)-1;
    
for(i=l1;i>=0;i-=4)
    
{
       a.s[a.len]
=num(s1,(i-3>0?i-3:0),i);
       a.len
++;
    }

    
for(i=l2;i>=0;i-=4)
    
{
       b.s[b.len]
=num(s2,(i-3>0?i-3:0),i);
       b.len
++;
    }

}

void mul()
{
    
long i,j;
    
for(i=0;i<a.len;i++)
      
for(j=0;j<b.len;j++)
      
{
         c.s[i
+j]+=a.s[i]*b.s[j];
         
if(c.s[i+j]>=10000)
         
{
            c.s[i
+j+1]+=c.s[i+j]/10000;
            c.s[i
+j]%=10000;
         }

      }

    
for(i=a.len+b.len;i>=0;i--)
      
if(c.s[i]!=0)
        
break;
    c.len
=i+1;
}

void write()
{
    
long i;
    printf(
"%ld",c.s[c.len-1]);
    
for(i=c.len-2;i>=0;i--)
    
{
       
if(c.s[i]<1000) printf("0");
       
if(c.s[i]<100) printf("0");
       
if(c.s[i]<10)   printf("0");
       printf(
"%ld",c.s[i]);
    }

    putchar(
'\n');
}

int main()
{
    init();
    mul();
    write();
return 0;
}

posted on 2010-01-06 19:59 lee1r 阅读(329) 评论(1)  编辑 收藏 引用 所属分类: 题目分类:基础/模拟

FeedBack:
# re: vijos P1040 高精度乘法
2012-12-06 01:10 | 啦啦啦
爱死你了  回复  更多评论
  

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