70 条题解
-
-1youandmetz LV 8 @ 2009-11-08 09:55:46
不能输出x/1 ,出题目不用这样吧,太不讲道理了。而且题目中说是连分数和分数的互化,这样写本质上没错啊!!!
-
-12009-11-08 09:36:22@
小鸟直接模拟居然写了这么长的程序。。。
program p1;
var
ch:char;
procedure swap(var a,b:longint);
var
k:longint;
begin
k:=a;
a:=b;
b:=k;
end;
procedure chuli1;
var
a:array[1..200]of longint;
z,m,i,j,k:longint;
begin
fillchar(a,sizeof(a),0);
read(ch);
i:=0;
while ch']' do
begin
inc(i);
while (ch',' )and ( ch';') and (ch']') and (ch'[') do
begin a[i]:=a[i]*10+(ord(ch)-ord('0')); read(ch); end;
if ch=']' then break;
read(ch);
end;readln;
m:=a[i]; z:=1;
while i>1 do
begin
dec(i);
z:=z +m *a[i];
swap(m,z);
end;
swap(m,z);
if m>z then j:=trunc(sqrt(m)) else j:=trunc(sqrt(z));for k:=2 to j do
if (m mod k =0) and(z mod k =0) then
while (m mod k =0) and(z mod k =0) do
begin
m:=m div k;
z:=z div k;
end;
if m1 then
writeln(z,'/',m) else writeln(z);
end;procedure chuli2;
var
s,z,m,i,j,k:longint;
begin
z:=0;
while ch'/' do
begin
z:=z*10+(ord(ch)-ord('0'));
read(ch);
end;
read(m);
readln;
s:=z div m;
write('[',s,';');
z:=z-m*s;
swap(m,z);if(m mod z0) then
begin
s:=z div m;
write(s);
z:=z-m*s;
swap(m,z);
end;
while (m 0) do
begin
s:=z div m;
write(',',s);
z:=z-m*s;
swap(m,z);
end;
writeln(']');
end;begin
while not eof do
begin
read(ch);
if ch='[' then chuli1 else chuli2;
end;end.
-
-12009-11-08 09:30:34@
var
s:string;
function gd(m,n:longint):longint;
begin
if n=0 then
gd:=m
else
gd:=gd(n,m mod n);
end;procedure a;
var
i,tot,fz,fm,tmp,z,code,k:longint;
x:array[1..1000] of longint;
begin
k:=pos(';',s);
if k=0 then
begin
writeln(copy(s,2,length(s)-2));
exit;
end;
if s[k+1]=']' then
begin
writeln(copy(s,2,k-2));
exit;
end;
val(copy(s,2,k-2),z,code);
delete(s,1,k);
delete(s,length(s),1);
k:=1;
tot:=0;
while true do
begin
inc(tot);
k:=pos(',',s);
if k0 then
begin
val(copy(s,1,k-1),tmp,code);
x[tot]:=tmp;
delete(s,1,k);
end
else
begin
val(s,tmp,code);
x[tot]:=tmp;
break;
end;
end;
i:=tot;
fm:=x[tot];
fz:=1;
if i1 then
repeat
fz:=fm*x+fz;
tmp:=fz;
fz:=fm;
fm:=tmp;
dec(i);
until i=1;
fz:=fz+fm*z;
tmp:=gd(fz,fm);
fz:=fz div tmp;
fm:=fm div tmp;
if fm=1 then
writeln(fz)
else
writeln(fz,'/',fm);
end;procedure b;
var
i,tot,fz,fm,tmp,z,zz,code,k:longint;
x:array[1..1000] of longint;
begin
k:=pos('/',s);
if k=0 then
begin
writeln(s);
exit;
end;
val(copy(s,1,k-1),fz,code);
val(copy(s,k+1,length(s)-k),fm,code);
tmp:=gd(fz,fm);
fz:=fz div tmp;
fm:=fm div tmp;
z:=0;
while fz>=fm do
begin
fz:=fz-fm;
inc(z);
end;
if fz=0 then
begin
write('[',z,']');
exit;
end;
write('[',z,';');
zz:=0;
repeat
tmp:=fm;
fm:=fz;
fz:=tmp;
zz:=0;
while fz>fm do
begin
fz:=fz-fm;
inc(zz);
end;
write(zz,',');
until fz=1;
write(fm,']');
writeln;
end;
begin
while not eof do
begin
readln(s);
if s[1]='[' then
a
else
b;
end;
end.测一下[3;3]就知道了……
-
-12009-11-08 09:27:05@
在昨天的程序里
加一个补丁
就行了
hint:昨天80分……
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar
s:string; b:boolean;
i,j,k,n,i1,i2,x,y,z1,z2:longint;
a:array[0..10000]of longint;
function gcd(x,y:longint):longint;
begin
if y=0 then exit(x);
gcd:=gcd(y,x mod y);
end;
begin
while not(eof)do
begin
readln(s); b:=false;
if pos('[',s)0 then
if pos(';',s)=0 then writeln(copy(s,2,length(s)-2))
else
begin fillchar(a,sizeof(a),0);
i1:=pos(';',s);
if s[2]='-' then begin b:=true;val(copy(s,3,i1-3),a[0]);end
else val(copy(s,2,i1-2),a[0]);
delete(s,1,pos(';',s));i2:=0;
while pos(',',s)0 do
begin
inc(i2);
val(copy(s,1,pos(',',s)-1),a[i2]);
delete(s,1,pos(',',s));
end;
inc(i2);val(copy(s,1,length(s)-1),a[i2]);
x:=1;y:=a[i2];
for j:=i2-1 downto 0 do
begin
z1:=a[j]*y+x;
x:=y;
y:=z1;
end;
if b then writeln(y-2*x*a[0],'/',x)else
writeln(y,'/',x);
end
else if pos('/',s)0then
if pos('/1',s)=length(s)-1 then writeln('[',copy(s,1,length(s)-2),']')
else begin
i1:=pos('/',s); if pos('-',s)0then begin val(copy(s,2,i1-2),x); b:=true;end
else begin val(copy(s,1,i1-1),x);end;
val(copy(s,i1+1,length(s)-i1),y);
z1:=gcd(x,y); write('[');
x:=x div z1;y:=y div z1;
if b then begin
write('-',x div y+1,';');
x:=y*(x div y+1)-x;end else
write(x div y,';'); x:=x mod y;
while (y0)and(y1) do
begin
if (y mod x0)then
write(y div x,',')else write(y div x);
y:=y mod x;
z2:=y;y:=x;x:=z2;
end;
writeln(']');
end;
end;
end.话说这个题还真让我迷茫呢
-
-12009-11-08 09:19:44@
program test1;
var s:string;
t1,t,t2,p,code,ls,up,down:longint;
begin
while not eof do
begin
readln(s);
if s[1]='[' then begin
ls:=length(s);
dec(ls);
p:=ls;
while s[p] in ['0'..'9'] do dec(p);
val(copy(s,p+1,ls-p),t1,code);
up:=1;down:=t1;
ls:=p;
if pos(';',s)=0 then begin writeln(t1);continue;end;
repeat
p:=ls-1;
while s[p] in ['0'..'9'] do dec(p);
val(copy(s,p+1,ls-p-1),t1,code);
up:=up+t1*down;
t:=up;up:=down;down:=t;
ls:=p;
until ls=1;
t:=up;up:=down;down:=t;
writeln(up,'/',down);
end
else begin
p:=pos('/',s);
val(copy(s,1,p-1),t1,code);
delete(s,1,p);
val(s,t2,code);
write('[');
write(t1 div t2);
if t1 mod t2=0 then begin writeln(']');continue;end
else write(';');
repeat
t1:=t1 mod t2;
t:=t1;t1:=t2;t2:=t;
write(t1 div t2);
if t1 mod t20 then write(',');
until t1 mod t2=0;
writeln(']');
end;
end;
end. -
-12009-11-08 09:11:46@
额...
沙茶了... -
-12009-11-08 08:55:32@
果然 不能输出 x/1 这种东西 不讲道理呀....
-
-12009-11-08 08:44:11@
program no1;
var st:string;
function zzxc(m,n:int64):int64;
var a,b,r:int64;
begin
a:=m;b:=n;
repeat
r:=a mod b;
a:=b; b:=r;
until r=0;
zzxc:=a;
end;
procedure doit(st:string);
var s,s1,s2,ss1,ss2:int64;
j,k,i:longint;
a:array[0..200] of longint;
bz:boolean;
begin
if st[1]='[' then
begin
fillchar(a,sizeof(a),0);
j:=2;k:=0;
while j='0') and (st[j] -
-12009-11-08 08:37:24@
我比赛的时候考虑到分子很大,分母很小的情况。于是计算不大于某个数的整数时二分了。结果对于某些分母较大的整数,在二分过程中会超过longint。改成循环后80分,结果发现漏了一种情况,即[x]是不用数出分母1的(考虑了约分竟然没考虑这个)。
-
-12009-11-08 08:29:41@
program test1;
const re:set of char=(['0','1','2','3','4','5','6','7','8','9']);
var i,j,k,m:longint;
s1,s2:ansistring;function gcd(a,b:longint):longint;
begin
if b=0 then gcd:=a else gcd:=gcd(b,a mod b);
end;procedure work1;
var i,j,k,m,n,fz,fm,t:longint;
x:array[1..10000] of longint;
boo:boolean;
Begin
i:=2;j:=1; boo:=false;
if s1[i]='-' then begin inc(i);boo:=true;end;
while ifm then
begin
for i:= n-1 downto 1 do
begin
t:=fm;fm:=fz;fz:=t;
fz:=fz+x[i]*fm;
end;
m:=gcd(fm,fz);
fm:=fm div m;
fz:=fz div m;
end;
if fm -
-12009-11-08 08:27:54@
完美版
function gcd(p,q:longint):longint;
var
temp:longint;
begin
if q=0 then gcd:=p
else gcd:=(q,p mod q);
end;begin
while not eof do
begin
readln(s);
len:=length(s);
fillchar(a,sizeof(a),0);
if s[1]='[' then
begin
num:=1;ex:=10;
for i:=2 to len-1 do
begin
if (s[i]=';') or (s[i]=',') then inc(num)
else
begin
a[num]:=a[num]*ex+ord(s[i]-'0');
end;
end;
if num=1 then writeln(a[1])
else
begin
up:=1;down:=a[num];
for i:=num-1 downto 1 do
begin
up:=up+a[i]*down;
r:=up;up:=down;down:=r;
g:=gcd(up,down);
up:=up div g;down:=down div g;
end;
if up1 then
writeln(down,'/',up)
else writeln(down);
end;
end
else
begin
l:=0;
while s[l]'/' do inc(l);
ex:=10;pp:=0;dd:=0;
for i:=1 to l-1 do
pp:=pp*ex+ord(s[i]-'0');
ex:=10;
for i:=l+1 to len do
dd:=dd*ex+ord(s[i]-'0');
write('[');
g:=gcd(pp,dd);ex:=1;
pp:=pp div g;dd:=dd div g;
while dd1 do
begin
if ex=1 then
begin
write(pp div dd,';');
inc(ex);
end
else write(pp div dd,',');
pp:=pp-pp div dd*dd;
temp:=pp;pp:=dd;dd:=temp;
end;
writeln(pp,']');
end;
end;
end. -
-12009-11-08 07:48:32@
2/1到底是什么啊啊啊啊
-
-12009-11-08 07:46:47@
编译通过...
测试数据01:答案正确... 0ms
测试数据02:答案正确... 0ms
测试数据03:答案正确... 0ms
测试数据04:答案错误...程序输出比正确答案长
测试数据05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:80 有效耗时:0ms
why?????????????????? -
-12009-11-08 08:57:43@
不知道哪里错了。。和一个AC的程序对拍一直是正确的。。。悲剧。
#include
#include
char buffer[2001],*buf;
inline long upfloor(double x)
{
if(x-(long)x-0.00000000000000001)return (long)x+1;
return (long)x;
}
inline long getw(long x)
{
if(!x)return 1;
if(x>0)
return upfloor(log10(x));
return upfloor(log10(-x))+1;
}
void ctof(long &a,long &b)
{
long t,t1,t2;
if(sscanf(buf,"%d",&t)>0)
{
buf+=getw(t)+1;
ctof(t1,t2);
b=t1;
a=t*t1+t2;
}
else
{
a=1;b=0;
}
}
void ftoc(long a,long b)
{
if(!a)return ;
printf("%d,",b/a);
b%=a;
ftoc(b,a);
}
void inline swap(long &a,long &b)
{
long t=a;
a=b;
b=t;
}
long Euclid(long a,long b)
{
if(ab?a-b:b-a,a>b?b:a);
else if(b&1)return Euclid(a>>1,b);
else if(a&1)return Euclid(a,b>>1);
else return Euclid(a>>1,b>>1);
}
void yf(long& a,long& b)
{
long register tmp=Euclid(a,b);
a/=tmp;b/=tmp;
}
int main()
{
freopen("fraction.in","r",stdin);
freopen("fraction.out","w",stdout);
while(scanf("%s",buffer)!=EOF)
if(buffer[0]=='[')
{
long a,b,t;
sscanf(buffer,"[%d",&t);
buf=buffer+getw(t)+2;
ctof(a,b);
yf(a,b);
if(a-1)
printf("%d/%d\n",b+t*a,a);
else
printf("%d\n",b+t);
}
else
{
long a,b;
sscanf(buffer,"%d/%d\n",&a,&b);
//printf("%d/%d=",a,b);
if(b=0)
{
yf(a,b);
printf("[%d;",a/b);
a%=b;
}
else
{
long tmp=-a;
yf(tmp,b);
if(tmp%b)
{
printf("[-%d;",tmp/b+1);
a=b-tmp%b;
}
else
{
printf("[-%d;",tmp/b);
a=0;
}
}
ftoc(a,b);
fseek(stdout,-1,SEEK_CUR);
printf("]\n");
}
return 0;
} -
-12009-11-08 15:51:03@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
后来!
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案错误...程序输出比正确答案长
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:80 有效耗时:0ms
为啥? -
-12009-11-08 01:00:21@
调了半天,原来是分母为1的时候不输出
交了n多次 -
-12009-11-08 00:31:29@
占楼~~orz
-
-12009-11-08 00:08:09@
*|可能不是满分程序
*|也可能是
#include
#include
char s[10000];
int main()
{
for(;scanf("%s",s)!=-1;)
{if(s[0]=='[')//连分数---|>分数
{
int j=0,locate=1,number;
long turn[10000]={};
for(number=0;locate='0'&&s[locate]=0;j--)
{
p1=p1+turn[j]*p2;
int temp=p1;
p1=p2;
p2=temp;
}
int temp=p1;
p1=p2;
p2=temp;
for(j=p2;j>0;j--)
if(p1%j==0&&p2%j==0)
{
p1/=j;
p2/=j;
break;
}
if(p2>1)printf("%d/%d\n",p1,p2);
else printf("%d\n",p1);
}
else
{
int j=0,locate=0,number;
long turn[2]={};
for(number=0;locate='0'&&s[locate] -
-12009-11-07 23:56:00@
mao2
-
-12009-11-07 21:48:39@
我算什么?