题目
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);
}
网友评论