切换到宽版
  • 17389阅读
  • 10回复

『原创』题目:无穷小数 [复制链接]

上一主题 下一主题
离线118140194
 
只看楼主 倒序阅读 0 发表于: 2005-10-31
一个十进制小数F=0.A1A2A3。。。,A1是奇数,A2是偶数。从A3开始,每一个数字等于他前面两位的和/4的余数,给出A1,A2的值,问F是不是有理数,如果是则把他转换成真分数输出!如果不是,则输出“NO!”
样例输入:
1 0
样例输出:
9193/90909
离线arronking
只看该作者 1 发表于: 2005-10-31
这个题目的关键在于判断有理数和无理数,判断其为有理数比判断其为无理数简单,要求证明其中的数串连续地循环出现。
但是如果用递归的话,只能判断其重出出现,却不能判断其连续性,麻烦啊
大秦魂不相信强盗悔忏,
只能用复仇雪耻的战争,
讨回我秦汉高贵的尊严。
强秦何曾看过六国脸色,
大汉何曾求过匈奴道歉?
用无坚不摧的滚滚铁骑,
踏平那敌国的巍峨宫殿!
离线zqzxjby
只看该作者 2 发表于: 2005-10-31
这题有数学解法来把无穷循环小数转为分数的。
离线hanmir
只看该作者 3 发表于: 2005-11-01
楼主 的
样例 输出好象错了!
按题意 和你的输入 输出应该是'no' 才 对啊!!!
离线118140194
只看该作者 4 发表于: 2005-11-01
样例绝对没有问题的!!可以过的
离线tangyouze
只看该作者 5 发表于: 2005-11-02
废话,
最后的两个数字一共只有99中排列
0 0
0 1
0 2



1 0
1 1
1 2




9 9
对于两个给定的数,后面生成的数是一定的。
如果出现
A B
经过n轮,再次出现A B
(因为只有99中排列,说一肯定存在这样的A B)
所以再过N 此,又出现A B所以是一个循环小数
所以不会打出NO
离线tangyouze
只看该作者 6 发表于: 2005-11-02
没用高精度
不敢保证对于所有点都通过


var
q:array[0..9,0..9] of boolean;
p:array[1..100]of int64;
gg,ans1,ans2:int64;
zi1,zi2,mu1,mu2,last,a,b,c:int64;
first,i:longint;
s:string;


function gcd(a,b:int64):int64;
begin
if b=0 then gcd:=a
else gcd:=gcd(b,a mod b);
end;
begin
a:=1;
b:=0;

p[1]:=a;
p[2]:=b;
i:=2;
repeat
  inc(i);
  q[a,b]:=true;
  c:=(a+b) mod 4;
  a:=b;
  b:=c;
  p:=b;
until q[a,b]=true;

last:=i-2;

for first:=1 to last do
begin
  if (p[first]=p[last+1])and(p[first+1]=p[last+2])
  then break;
end;

for i:=1 to first-1 do
  zi1:=zi1*10+p;
  mu1:=1;
for i:=1 to first-1 do
  mu1:=mu1*10;

for i:=first to last do
  zi2:=zi2*10+p;

  mu2:=9;
for i:=first+1 to last do
  mu2:=mu2*10+9;
mu2:=mu2*mu1;


ans1:=zi1*mu2+zi2*mu1;
ans2:=mu1*mu2;
gg:=gcd(ans1,ans2);
ans1:=ans1 div gg;
ans2:=ans2 div gg;
  writeln(ans1,'/',ans2);

end.
离线hanmir
只看该作者 7 发表于: 2005-11-03
楼上的
你的程序 怎么只是 在 解释 样例 的输入输出啊!!
而且你的程序好想很繁琐啊!!!
需要简化啊
离线阿瞬
只看该作者 8 发表于: 2005-11-04
弱题
还敢拿来 华山论剑。。。。。。
离线stevenjl

只看该作者 9 发表于: 2005-11-04

program wqxs;
var i,j,k,c,a,b :integer;
var fz1,fz2,fz,fm: longint;
var pd:byte;
var x,temp:string;

procedure sorry;
begin
writeln('Sorry, the number you input is wrong!');
halt;
end;

function ws(x:string):integer;
var cz:byte;
begin
ws:=pos('101123',x);
pd:=1;
cz:=1;
if cz=0 then
begin
ws:=pos('303321',x);
pd:=2;
cz:=1;
end;
if cz=0 then sorry;
end;

procedure qws;
begin
str(a,temp);
x:=x + temp;
str(b,temp);
x:=x+temp;
for i := 1 to 20 do
begin
c:=(a+b) mod 4;
a:=b;
b:=c;
str(c,temp);
x:=x+temp;
end;
end;

procedure yf(var x,y:longint);
var i,j,k:longint;
begin
i:=x;j:=y;
repeat
k:=i mod j;
i:=j;j:=k;
until k=0;
x:=x div i;y:=y div i;
end;

begin
read (a,b);
if (not odd(a)) then sorry
else if odd(b) then sorry
else if ((a<0) or (a>9)) then sorry
else if ((b<0) or (b>9)) then sorry;
qws;
ws(x);
val(copy(x,1,ws(x)-1),fz1,k);
if pd=1 then fz2:=101123
else fz2:=303321;
fz:=fz1*999999+fz2*round(exp((ws(x)-1)*ln(10)));
fm:=999999*round(exp((ws(x)-1)*ln(10)));
yf(fz,fm);
writeln(fz,'/',fm);
end.

Dream Walker...
快速回复
限100 字节
 
上一个 下一个