把输入的小数转化为分数,然后化简为最简分数,在AB和CD上反射次数等于分子-1,在AD和BC上的反射次数等于分母-1。
懂反射的一般都知道通过做对称图来做反射线,个人感觉上述做法应该是对的。
关键在于无限循环小数的转化:
例如,输入0.876 Y
其实0.876876876........=876/999
化简后为:292/333
反射总次数应为:292-1 + 333-1==623
同理:0.123456789123456789123456789.............=123456789/999999999
;
;
;
;
本人感觉上述算法应该没有错误,但是写出来的代码却有四个测试点过不了。还请高手指正!
LZ,请别这样算,如果就这么简单的话,连学过循环小数的三四年级学生都算的出来。
如果连动规都不需要,这道题目不就成了水题了吗?
#include <cstdio>
#define G getchar()
int a=0, b=1, t;
char c;
inline int gcd(int a, int b) {while ( b ) {t=a; a=b; b=t%a;} return a;}
int main(void) {
if ( G=='1' ) puts("0");
else {
for (c=G; (c=G)>='0' ;b*=10) a=a*10+c-'0';
b-=G=='Y';
printf("%d\n", (a+b)/gcd(a, b)-2);
}
}
看了终于AC了,感谢楼主,让我再一次获得AC的机会!!!!!!!!!!!!!!!
顺便为了报答,送楼主一个程序:
program gdfs;
var
b,c:longint;
a:string;
i,j:longint;
n:longint;
ch:char;
begin
readln(a);
b:=0; c:=1;
n:=length(a)-2;
for i:=3 to 2+n do
begin
b:=b*10+ord(a[i])-48;
c:=c*10;
end;
readln(ch);
//c:=c*10;
if ch='Y' then
begin
c:=0;
for i:=3 to n+2 do
begin
c:=c*10+9;
end;
end;
j:=b;
for i:=2 to j do
begin
while (b mod i=0) and (c mod i=0) do
begin
b:=b div i;
c:=c div i;
end;
end;
if b-1+c-1<0 then writeln(0) else writeln(b-1+c-1);
readln;
end.
看了终于AC了,感谢楼主,让我再一次获得AC的机会!!!!!!!!!!!!!!!
顺便为了报答,送楼主一个程序:
program gdfs;
var
b,c:longint;
a:string;
i,j:longint;
n:longint;
ch:char;
begin
readln(a);
b:=0; c:=1;
n:=length(a)-2;
for i:=3 to 2+n do
begin
b:=b*10+ord(a[i])-48;
c:=c*10;
end;
readln(ch);
//c:=c*10;
if ch='Y' then
begin
c:=0;
for i:=3 to n+2 do
begin
c:=c*10+9;
end;
end;
j:=b;
for i:=2 to j do
begin
while (b mod i=0) and (c mod i=0) do
begin
b:=b div i;
c:=c div i;
end;
end;
if b-1+c-1<0 then writeln(0) else writeln(b-1+c-1);
readln;
end.