先说结论,这是一道与唯一分解定理有一定关系的题目
Part 1 分析题面
若题目说若 a1 可化为一个有限的,不循环的小数,则称 a 为终止数。
看到分数,自然而然地联想到唯一分解定理,那我们分解后再看怎样才能确定 a1 是有限小数。
Part 2 证明
显而易见,只要一个分数可以化成 10Nk( k 为整数)的形式,那么它就是一个有限小数。那我们的目的就变成了证明 a1=10Nk
如果说 a 在分解质因数后只有 2 和 5 两个质因数,即当 a=2m⋅5n 时,则 a1 是有限小数,其他都是无限小数。
1.结论一:当 a=2^m·5^n 时,则 1/a 是有限小数
1. m>n
当 m>n 时,我们需要补齐 5 的个数。给分子和分母同时乘以 5m−n :
2m⋅5n1=2m⋅5n⋅5m−n1⋅5m−n=2m⋅5m5m−n=(2⋅5)m5m−n=10m5m−n
2. m<n
当 m<n 时,我们需要补齐 2 的个数。给分子和分母同时乘以 2n−m :
2m⋅5n1=2m⋅2n−m⋅5n1⋅2n−m=2n⋅5n2n−m=(2⋅5)n2n−m=10n2n−m
3. m=n
当 m=n 时,分母已经是 10 的幂:
2m⋅5m1=10m1
在上述所有情况中,分数 a1 最终都可以写成如下形式:
a1=10NK
其中 K 是一个整数, N=max(m,n) 。
根据十进制计数法的定义,任何除以 10N 的整数,其结果就是在该整数的末尾向前移动 N 位小数点。因为 K 是一个有限长度的整数,所以移动小数点后的结果必然是一个有限小数。
2.结论二:当不满足 a=2^m·5^n 时,则 1/a 不是有限小数
容易想到,如果说里边有一个其他的质数,则经过任意次操作,分数都不能写成 10nk 的形式。
Part 3 编写代码
既然已经有了证明,那代码就简单多了,只需将 L 到 R 中的数一一对比是否有 2 和 5 之外的质因数数就可以了。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include<bits/stdc++.h> using namespace std; int l,r,ans; int main(){ cin>>l>>r; for(int i=l;i<=r;i++){ int a=i; while(!(a%2))a/=2; while(!(a%5))a/=5; if(a==1)ans++; } cout<<ans; }
|
p.s 本人就是今年三月考五级,当时定式思维了,以为涉及到质数的就用筛法,写的超麻烦。回家又看了一下,不禁感叹当时的自己怎么这么蠢。