我是靠谱客的博主 震动电话,最近开发中收集的这篇文章主要介绍循环小数第2题 循环小数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第2题 循环小数

提交文件:float.pas/.cpp

输入文件:float.in

输出文件:float.out

 

给出一个循环小数XX = 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

输出格式:

输出两个正整数AB,用空格隔开,表示分数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.

最后

以上就是震动电话为你收集整理的循环小数第2题 循环小数的全部内容,希望文章能够帮你解决循环小数第2题 循环小数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部