題目
0.abcabc......循環(huán)節(jié)為abc,將其化成最簡(jiǎn)分?jǐn)?shù),分子有多少種,編程實(shí)現(xiàn)。
思路
1.題目與無(wú)限循環(huán)小數(shù),循環(huán)節(jié)相關(guān),與之前的通過(guò)余數(shù)尋找循環(huán)節(jié)的題目相似,因此初始思路是利用余數(shù),循環(huán)節(jié)長(zhǎng)度找到分子與abc的關(guān)系。
2.但循環(huán)節(jié)長(zhǎng)度確定為3,格式確定為0.abc...,應(yīng)該有更簡(jiǎn)便的方式將其轉(zhuǎn)化為分?jǐn)?shù)形式,于是搜索找到:
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.題目被轉(zhuǎn)換成 abc / 999 在最簡(jiǎn)形式下分子有多少種。
abc的范圍可以確定為1-999(0明顯不成立),分子可能出現(xiàn)重復(fù)的情況為:abc與999(3 * 3 * 3 * 37)擁有共同因數(shù),分?jǐn)?shù)被約分,分子的值重復(fù)出現(xiàn)。因此通過(guò)循環(huán)判斷abc在各值時(shí)是否能夠被3與37整除可以得到答案。
當(dāng)時(shí)想到以下結(jié)構(gòu):

當(dāng)abc為3、9、27的倍數(shù)時(shí),分子被化為abc/3、abc/9、abc/27。由于abc取值上線為999,還可能出現(xiàn)abc為81的倍數(shù),243的倍數(shù)等,此時(shí)abc仍然只能被化為abc/27,因?yàn)?99的可提供的因數(shù)只到27。例如當(dāng)abc為81(3 * 37)時(shí),分?jǐn)?shù)的值為3/37,分子3第一次出現(xiàn)(之前出現(xiàn)時(shí)可以被約分化簡(jiǎn))。abc為243的倍數(shù)時(shí)同理。
因此,還需要在判斷時(shí)增加abc無(wú)法被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);
}