| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1410 人关注过本帖, 1 人收藏
标题:猜一猜,做一做。
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏(1)
已结贴  问题点数:100 回复次数:32 
猜一猜,做一做。
421052631578947368
你能猜出上面这个数中隐藏的奥秘吗?
你能用一个C语言程序将这样的数输出吗?数字的长度不超过10000位。
搜索更多相关主题的帖子: 数字 C语言 
2012-02-28 21:20
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
经baidu得,将此数的最后一位放在最前面会是原数的两倍
2012-02-28 21:32
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:0 
二楼的对嘛?

最基础的往往是你最容易忽略的!
2012-02-28 21:33
zxd675816777
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:252
专家分:631
注 册:2012-2-3
收藏
得分:0 
哇塞。。。表示学习

数学好难!
2012-02-28 23:04
a646404908
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:189
专家分:492
注 册:2012-2-14
收藏
得分:0 
顶下+接分
2012-02-28 23:20
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
二楼明示了,   还是要尝试做做
2012-02-28 23:24
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
如果用普通的算法,就是大数的乘法嘛,很简单啊.
2012-02-29 00:37
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
不经小曹提醒我是看不出规律了。现在的问题就是已知这一规律后,如何找到这样的数。

直接穷举铁定是不行的,1000位,可以算到宇宙毁灭了。

还是先分析一下这个问题。

设这个数为X,将X拆成两段,前面的数设为A, 最后一位设为B。

即 X = 10A + B

那么这一规律即可表示为 2*(10A + B) = B * 10 ^ [log10(A) + 1] + A

整理一下,即 19 * A = (10 ^ [log10(A) + 1] - 2) * B

设 C = 10 ^ [log10(A) + 1] - 2

上式可表示为

19 * A = C * B

A = B * C / 19

由此,只要找到一对B、C,使得 B * C 能被19整除,就找到了对应的A,从而找到一个满足这一规律的数X。

事实上,19是一个质数,而B是不可能被19整除的(B是个1位十进制数),所以 B * C 能被19整除的充要条件是 C 能被19整除

其中,C 的取值为8、98、998、9998、99998...

再聊聊B的取值。B是个一位数,所以最大范围是 0 到 9

而由题意明显可知,0 是不能取的, 所以是 1 到 9

再分析一下,由C的定义可知, C 的长度是等于 A 的, 所以要求 B * C / 19 的长度也必须等于 A 的长度

所以 B 的值也不能取1。实际上为了使B * C / 19 的长度等于 A 的长度, B的取值范围只能也一定是2 到 9

关于这一点的证明,话比较多,现在太晚了,就不详述了。

这里既然设定X的范围是10000位以内,即C的可取数值有9999个,就算10000个吧

先用大数运算找到能被19整除的C,然后对这样的C乘上可取的B得出A。

以上,便是由对问题的分析导的算法概况。

最后,估计一下算法的执行时间。

在采用10000进制的数来存储C的话,最大的C的长度是2500个单元。

对C进行一次能否被19整除的判定最多需要进行2500次除法运算(加法暂时忽略不计)

对于判定成功的C乘以B即得到A,也就得到了X

由此找到所有的X 一共大约需要进行10000 * 2500 * 7 = 175000000次乘法运算。

这里估计的是算法消耗时间的上限,实际中如果C不能被19整除,那就不需要对其乘B。实际消耗时间应该比上面估计的要少一个数量级。

所以由上面算法实现的程序大概可以在1分钟以内找到10000位以内所有的满足题意要求的数X。

以上只是我个人的思想实现,有什么不足之处还请指正, 各位有更好的想法也请发上来分享。打字花了我不少时间,该休息了。

重剑无锋,大巧不工
2012-02-29 02:13
舍不得迁徙
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-2-29
收藏
得分:0 
还是版主强悍!@
2012-02-29 07:35
ouyangouyang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:579
注 册:2009-10-8
收藏
得分:0 
8楼的我表示很欣赏你

多少恨, 昨夜梦魂中。 还似旧时游上苑, 车如流水马如龙; 花月正春风!
2012-02-29 07:50
快速回复:猜一猜,做一做。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017720 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved