循环小数

    xiaoxiao2021-03-25  159

    第2题 循环小数

    提交文件:float.pas/.cpp

    输入文件:float.in

    输出文件:float.out

     

    给出一个循环小数X,X = 0.a1a2...an(b1b2...bm)。 (b1b2...bm)代表小数的循环节。例如:0.5 = 0.50 = 0.5(0) = 0.5(00) = 1/2, 0.3(3) =0.333(33) = 1/3。现在,你需要将这个循环小数转化为分数形式A/B(A和B的公约数必须为1)

     

    输入格式:

    第一行有两个正整数n, m。

    第二行有n个正整数a1a2...an

    第三行有m个正整数b1b2...bm

    输出格式:

    输出两个正整数A和B,用空格隔开,表示分数A/B。

     

    输入样例:

    4 2

    3333

    33

     

    输出样例:

    1 3

    数据范围:

    对于20%数据 1 ≤n, m ≤ 6

    对于所有数据 1 ≤ n, m≤ 8

    分析:

    将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.例如0.111...=1/9、0.12341234...=1234/9999

    混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.

    代码

    var   n,m,a,b:int64; function gcd(a,b:int64):int64; begin   if b=0 then     exit(a);   exit(gcd(b,a mod b)); end; procedure init; begin   readln(n,m);   readln(a);   readln(b); end; procedure main; var   i:longint;   num,ans,tot:int64; begin   num:=a;   ans:=0;   for i:=1 to m do     begin       num:=num*10;       ans:=ans*10+9;     end;   num:=num+b-a;   for i:=1 to n do     ans:=ans*10;   tot:=gcd(num,ans);   write(num div tot,' ',ans div tot); end; begin   assign(input,'float.in');reset(input);   assign(output,'float.out');rewrite(output);   init;   main;   close(input);close(output); end.

    转载请注明原文地址: https://ju.6miu.com/read-20758.html

    最新回复(0)