各种犯错,欧拉计划26题:找出小于1000的数字d,1/d 的十进制表示含有最长的循环圈。有很多问题请教大家

101 篇文章 7 订阅
52 篇文章 0 订阅

先看看题目:

分子为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/的十进制表示含有最长的循环圈。


这个题目其实知道一定的知识还时很好做的。

我们知道,如果一个数的质因子全是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的值,这样会陷入死循环的!!!!











评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值