这个问题不需要仅适用于终止小数-重复小数也可以通过算法转换为分数。
您的任务是制作一个以重复小数作为输入的程序,并输出相应的分子和分母(以最低的术语表示),从而产生十进制扩展。大于1的分数应表示为不正确的分数,如9/5。你可以假设输入是正的。
重复的小数点将以这种格式表示:
5.3.87第二个圆点之后的每一件事都重复了下来,如下所示:
5.3878787878787...您的程序将输出两个表示分子和分母的整数,用斜杠分隔(如果不输出纯文本,则用您的语言中的等效形式):
889/165请注意,结束小数将没有在第二个点之后,小数和没有重复小数部分将没有在这两个点之间。
这些测试用例涵盖了所有需要的角用例:
0..3 = 1/3
0.0.3 = 1/30
0.00.3 = 1/300
0.6875. = 11/16
1.8. = 9/5
2.. = 2/1
5..09 = 56/11
0.1.6 = 1/6
2..142857 = 15/7
0.01041.6 = 1/96
0.2.283950617 = 37/162
0.000000.1 = 1/9000000
0..9 = 1/1
0.0.9 = 1/10
0.24.9 = 1/4如果你愿意的话,你也可以假设没有整数部分的分数在第一个点的左边没有任何东西。您可以使用这些可选的测试用例对其进行测试:
.25. = 1/4
.1.6 = 1/6
..09 = 1/11
.. = 0/1发布于 2014-03-14 18:23:35
相当长的时间。可能会进一步减少。没有scanf,如果在点之间没有任何数字的话,它真的无法处理。没有strtol。只是数字计算:
a,b,c,d,q;main(){while((q=getchar()-48)>-3)q<0?(d=b>0,b+=!b):d?(c=c*10+q,d*=10):(a=a*10+q,b*=10);for(a=a*--d+c,q=b*=d;q>1;a%q+b%q?--q:(a/=q,b/=q));printf("%d/%d\n",a,b);}测试:
rfc <<< "2..142857"
15/7发布于 2014-03-15 15:58:45
太久了,但还是很有趣。因为分号是不可读的。
s=prompt(b=1).split(".")
P=Math.pow
a=s[0]
c=s[1]
d=P(10,l=c.length)
f=(P(10,s[2].length)-1)*P(10,l)||1
e=s[2]=+s[2]
a=d*a+b*c;b*=d
a=f*a+b*e;b*=f
function g(a,b){return b?g(b,a%b):a}g=g(a,b);a/g+"/"+b/g发布于 2014-03-16 13:24:15
另一种基于非常不同的方法的解决方案;这一次它是完全通用的;只有在提交整数时缺少1分母:
".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '.1.3'
2r15
".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '.1.'
1r10
".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '1..'
1
".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '1..3'
4r3https://codegolf.stackexchange.com/questions/17907
复制相似问题