337 条题解
-
0
BTMHLY LV 3 @ 2008-11-11 19:51:15
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 88ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:88msprogram hly;
const
cmax=100000;
base=10000;
var
a,b:array[1..cmax] of longint;
c:array[1..2*cmax] of longint;
num1,num2:ansistring;
len1,len2:longint;procedure init;
var
i,index:longint;
begin
readln(num1);
readln(num2);
fillchar(a,sizeof(a),0); fillchar(b,sizeof(b),0); fillchar(c,sizeof(c),0);
if length(num1) mod 40 then
for i:=1 to 4-length(num1) mod 4 do
num1:='0'+num1;
if length(num2) mod 40 then
for i:=1 to 4-length(num2) mod 4 do
num2:='0'+num2;
len1:=length(num1) div 4;len2:=length(num2) div 4;
for i:=1 to len1 do
val(copy(num1,4*i-3,4),a[len1-i+1]);
for i:=1 to len2 do
val(copy(num2,4*i-3,4),b[len2-i+1]);
end;procedure multiply;
var
i,j,id,carry:longint;
begin
carry:=0;
for i:=1 to len2 do
for j:=1 to len1 do
begin
c:=c+b[i]*a[j];
if c>=base then
begin
c:=c+c div base;
c:=c mod base;
end;
end;
end;
procedure out;
var
st:string;
p,i,j:longint;
begin
p:=len1+len2;
while (p>0) and (c[p]=0) do
dec(p);
if p=0 then write('0') else
begin
write(c[p]);
for i:=p-1 downto 1 do
begin
str(c[i],st);
if length(st) mod 4 0 then
begin
for j:=1 to 4-length(st) mod 4 do
write('0');
write(st);
end
else
write(st);
end;
writeln;
end;
end;begin
init;
multiply;
out;
end. -
0@ 2008-11-13 18:02:44
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:运行超时...
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:75 有效耗时:0ms编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 88ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:88msvar a,b:array[1..10000] of 0..9 ;
c:array[1..10000000] of integer ;
str1,str2,te:ansistring;
l1,l2,i,code,j:integer;
begin
readln(str1);
readln(str2);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
if length(str1) < length(str2) then
begin
te:=str1;
str1:=str2;
str2:=te;
end;
l1:=length(str1);
l2:=length(str2);
for i:= 1 to l1 do
val(str1[i],a[i],code);
for i:= 1 to l2 do
val(str2[i],b[i],code);
for i:= l2 downto 1 do
begin
for j:= l1 downto 1 do
c[10000+j-l1+i-l2]:=a[j]*b[i]+c[10000+j-l1+i-l2];
for j:= 10000 downto 1 do
if c[j] >=10 then begin c[j-1]:=c[j] div 10 + c[j-1] ; c[j]:=c[j] mod 10 ; end;
end;
for i:= 1 to 10000 do
if c[i] 0 then break ;
for j:= i to 10000 do
write(c[j]);
readln
end.
天 -
0@ 2008-11-10 16:42:18
#include
using namespace std;
int al(int x)
{
int i,j,n;
i=0;
n=x;
while(n!=0){n/=10;i++;}
for(j=0;j -
0@ 2008-11-10 11:42:37
非常好又很简洁的题~
同时练习了高精加、高精乘单精的写法呢。一击必杀纪念...
大家注意判断乘数...如果出现零 = =
比较容易出错的地方,就是累加的移位。咱用的10000压缩...数据4近200ms,看楼下某牛用1000000000压秒杀,心碎...
其实咱还加了个末尾零优化...
读入的时候记录两个数末尾零的个数,然后删除之,再进行计算,
最后输出这些零就可以了。
不过貌似对这次的数据没有帮助 = = -
0@ 2008-11-10 09:07:55
看来真是人品问题啊!
忘记将string 改为ansistring了
调试时为了方便看喜欢将ansistring变为
string每次都忘记改回来,真是失败啊! -
0@ 2008-11-07 21:52:55
万进制存储就是了,不过要用ANSISTRING(陋习……建议大家都用数组,方便快捷)
-
0@ 2008-11-07 18:00:21
4位一存的处理:
for(i=1;i -
0@ 2008-11-06 18:59:22
#include
#include
#define maxl 10000
long a[maxl+10],b[maxl+10],c[maxl*2+10];
void print_num(long *jj)
{
long i;
for(i=jj[0];i>=1;--i)
printf("%ld",jj[i]);
printf("\n");
}
int main()
{
long len,i,j;
char s[maxl+10];
scanf("%s",s);
a[0]=strlen(s);
if('0'==s[0]) {printf("0\n");return 0;}
for(i=0;i -
0@ 2008-11-05 19:24:04
1次AC
OH YEAH~~
-
0@ 2008-11-05 09:49:19
没想到一个难度3的题。。。。。秒杀+1次AC+我这样的菜鸟。。。。。
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms压缩为10000进制的就可以了,但是数组要大一点
-
0@ 2008-11-03 22:55:59
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:运行时错误...|错误号: -1073741571
什么意思啊???? -
0@ 2008-10-30 22:59:52
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
---|---|---|---|---|---|---|---|---|---|---|-
压位就是 速度 (用 QWORD 九位压缩) 暴快 -
0@ 2008-10-30 20:15:27
很郁闷...看下面雅礼中学同学写的..我觉得是目前很好的一种方法...
恩...华二的信息小组报废了....向往雅礼.... -
0@ 2008-10-28 20:50:17
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms#include
#define SIGN_CF_BITS 4
#define SIGN_CF 10000
#define PARTS 8000
#define init() int *pa,*pb,*pc,*paend,*pbend; \
pa=&a->s[0];pb=&b->s[0];pc=&c->s[0]; \
paend = &a->s[a->len];pbend = &b->s;
#define sup() pa=pc-1; \
while (pc>paend && !*pa) {pc--;pa--;}typedef struct
{
int s[PARTS+1];
int len;
}hp;void cov(hp *x,char s[])
{
int i,len,t,k;
len = strlen(s);k=0;
for (len-=SIGN_CF_BITS;len>=0;len-=SIGN_CF_BITS)
{
i=0;
again:
t=0;
for (;is[k++] = t;
}
if (len>-SIGN_CF_BITS)
{
i = SIGN_CF_BITS-(len+SIGN_CF_BITS);
goto again;
}
x->len = k;
}void pnt(hp *x,char buf[])
{
int i,len,num,j=0,k,f;
len = x->len-1;
for (i=len;i>=0;i--)
{
num = x->s[i];
if (nums[0];
}hp x,y,z;
char str[160000];int main()
{
while (scanf("%s",str)!=EOF)
{
cov(&x,str);
scanf("%s",str);
cov(&y,str);mul(&x,&y,&z);
pnt(&z,str);
puts(str);
}return 0;
} -
0@ 2008-10-28 20:29:09
rp低死了...
写个高精乘竟然还把j打成了i
交了2次才过...
压8位高精真不错...秒杀 -
0@ 2008-10-28 08:42:34
数组开小了~委琐的提交了6次~!!!!!
-
0@ 2008-10-21 23:29:17
10000进制需要配合long long 试用 负责越界,建议用1000进制
-
0@ 2008-10-19 21:53:44
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
快吧?
用unsigned long存储,每8位压缩一次.
AC的人可以挑战下http://www.spoj.pl/problems/MUL/ -
0@ 2008-10-17 20:56:52
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 25ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:25ms可爱的Lora Temper,真快
-
0@ 2008-10-14 21:16:08
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 9ms
---|---|---|---|---|---|---|---|-
不开5000还真过不了 郁闷啊type bn=array[0..5000] of longint;
var
a,b,c:bn;
sa,sb,st:ansistring;
l,i,tm:longint;
procedure stn(s:ansistring;var num:bn);
begin
while length(s) mod 4 0 do insert('0',s,1);
l:=length(s);
for i:=1 to l div 4 do
begin
st:=copy(s,l-i*4+1,4);
val(st,num[i]);
end;
num[0]:=i;
end;
procedure multiply(a,b:bn;var c:bn);
var i,j:longint;
begin
for i:=1 to a[0] do
for j:=1 to b[0] do
begin
inc(c,a[i]*b[j]);
inc(c,c div 10000);
c:=c mod 10000;
end;
if c[a[0]+b[0]]=0 then c[0]:=a[0]+b[0]-1 else c[0]:=a[0]+b[0];
end;begin
readln(sa);readln(sb);
stn(sa,a);stn(sb,b);
multiply(a,b,c);
write(c[c[0]]);
for i:=c[0]-1 downto 1 do
begin
tm:=1000;
while tm0 do
begin
write(c[i] div tm);
c[i]:=c[i] mod tm;
tm:=tm div 10;
end;
end;
writeln;
end.