美文网首页
循环节为abc,求最简分子数

循环节为abc,求最简分子数

作者: Ell1ot | 来源:发表于2019-04-25 09:24 被阅读0次
    题目

    0.abcabc......循环节为abc,将其化成最简分数,分子有多少种,编程实现。

    思路

    1.题目与无限循环小数,循环节相关,与之前的通过余数寻找循环节的题目相似,因此初始思路是利用余数,循环节长度找到分子与abc的关系。

    2.但循环节长度确定为3,格式确定为0.abc...,应该有更简便的方式将其转化为分数形式,于是搜索找到:
    0.a... * 10 - 0.a... = a.a... - 0.a...
    0.a... * (10-1) = a
    0.a... = a / 9
    同理可得:
    0.abc... * 1000 - 0.abc... = abc.abc... - 0.abc...
    0.abc... * (1000-1) = abc
    0.abc... = abc / 999

    3.题目被转换成 abc / 999 在最简形式下分子有多少种。
    abc的范围可以确定为1-999(0明显不成立),分子可能出现重复的情况为:abc与999(3 * 3 * 3 * 37)拥有共同因数,分数被约分,分子的值重复出现。因此通过循环判断abc在各值时是否能够被3与37整除可以得到答案。
    当时想到以下结构:


    微信截图_20190425092725.png

    当abc为3、9、27的倍数时,分子被化为abc/3、abc/9、abc/27。由于abc取值上线为999,还可能出现abc为81的倍数,243的倍数等,此时abc仍然只能被化为abc/27,因为999的可提供的因数只到27。例如当abc为81(3 * 37)时,分数的值为3/37,分子3第一次出现(之前出现时可以被约分化简)。abc为243的倍数时同理。
    因此,还需要在判断时增加abc无法被81整除的约束。

    代码
    #include <stdio.h>
    int main()
    {
        int num=0;
        for (int i = 1; i <= 999; i++)
        {
            if ((i % 3 == 0 || i % 37 == 0)&&i%81!=0)
                ;
            else
                num++;
        }
        printf("%d", num);
    }

    相关文章

      网友评论

          本文标题:循环节为abc,求最简分子数

          本文链接:https://www.haomeiwen.com/subject/jtkvgqtx.html