先看看题目:
分子为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++)
{
}
在大括号中间不要修改$i的值,这样会陷入死循环的!!!!