先看看题目:
分子为1的分数称为单分数。分母是2到10的单分数用十进制表示如下:
1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6) 1/7 = 0.(142857) 1/8 = 0.125 1/9 = 0.(1) 1/10 = 0.1
其中0.1(6) 表示 0.166666...,因此它又一个长度为1的循环圈。可以看出1/7拥有一个6位的循环圈。
找出小于1000的数字d,1/d 的十进制表示含有最长的循环圈。
这个题目其实知道一定的知识还时很好做的。
我们知道,如果一个数的质因子全是2和5的话,这个数的倒数是不会无限循环的
如2,4,5,8,10
而一个数把质因子中的2和5除去后,得到一个数,我们称之为“基数”吧
这个数和它的基数的倒数循环的长度是相同的
比如说3和6的倒数的循环长度都是1
而怎么计算一个数的循环长度呢
只需要知道它能被多少长度的9整除就行了
3能被9整除,所以它的循环长度是1
7能被999999整除,商正好是循环体142857,所以它的循环长度是6
我想这一点大家应该很好理解吧
有前面的分析我们可以很容易得到这道题的解法
先求一个数的基数,如果是它本身,则计算它的循环长度
如果不是它自身,那它的循环长度等于基数的循环长度
我们规定1的循环长度是0,这样所以只含2,5为质因子的数的基数都为1,循环长度为0
上面是分析,只是代码老出错,最后重写了以后,得出了正确的结果,但是,原来的始终没有得到正确结果,大家也来分析一下吧:
正确的程序:
use bignum; my %hash; for(1..1000) { $j=$_; while($j%2==0) { $j=$j/2; } while($j%5==0) { $j=$j/5; } if(exists $hash{$j}) { next; } else { $hash{$j}=$j;#不要用胖箭头,直接等于就OK了 } } my $big=0; foreach $key (sort{$a<=>$b}keys %hash) { for(1..1000) { $j=$_; $m=10**$j-1; if($m%$key==0) { $cout=$j; last; } } if($cout>$big) { $big=$cout; } } print "$big\n";
结果:答案是983.想问问为啥?
C:\WINDOWS\system32\cmd.exe /c perl "C:\Documents and Settings\Administrator\ 面\b.pl" 982 Hit any key to close this window...错误程序如下:我也不知道哪里出错了,等以后有时间过来反思吧!
use strict; use warnings; my $m; my $i; my $j; my $cout; my $sum=0; my $start_time; my $time; my $n; $start_time=time; foreach(17..200) { $j=$_; while($j%2==0) { $j=$j/2; } while($j%5==0) { $j=$j/5; } print "$j "; foreach(1..1000) { $n=10**$_-1; if($n%$j==0) { $cout=$_; print "$cout\n"; last; } else { next; } } if($cout>$sum) { $sum=$cout; } } print "$sum\n"; $time=time-$start_time; print "time = $time\n";
这里还有一个错误,就是在用for循环的时候
for($i=1;$i<1000;$i++) { }