| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1403 人关注过本帖
标题:报纸上的智力题
只看楼主 加入收藏
从菜鸟起步
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2007-9-8
收藏
 问题点数:0 回复次数:10 
报纸上的智力题
无意在报纸上看到一道智力题:
用一个比一打但又尽可能小的自然数,乘以1997,使它的乘积中出现5个连续的“9”。
试着用vb编个小程序来算,下边是我的代码:
Dim i As Integer, x As Integer
Dim lngresult As Long
Dim strwant As String
i = 2
Do
lngresult = 1997 * i
For x = 1 To Len(CStr(lngresult))
strwant = Mid(CStr(lngresult), x, 5)
If strwant = "99999" Then
Exit For
Else: x = x + 1
End If
Next x
i = i + 1
Loop Until strwant = "99999"
Print i
出错显示上边红色的部分“溢出”
实在看不出哪里溢出了,所以来请教大家。
搜索更多相关主题的帖子: 智力题 lngresult CStr Dim strwant 
2007-10-22 22:03
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
lngresult = 1997& * i

VB QQ群:47715789
2007-10-23 09:15
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
不过你的算法好像不对,自己再检查吧。

VB QQ群:47715789
2007-10-23 09:16
心中有剑
Rank: 2
等 级:新手上路
威 望:5
帖 子:611
专家分:0
注 册:2007-5-18
收藏
得分:0 
Private Sub Command1_Click()
Dim llNum As Long
llNum = 2
Do
llNum = llNum + 1
Loop Until InStr(llNum * 1997, "99999") > 0
MsgBox llNum & "*1997=" & llNum * 1997
End Sub

2007-10-23 09:38
三断笛
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:31
帖 子:1621
专家分:1617
注 册:2007-5-24
收藏
得分:0 
2003
2007-10-23 17:44
从菜鸟起步
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2007-9-8
收藏
得分:0 
看了4楼的答案问题解决了,原来不知道instr()函数。。。。
继续看书去了,谢谢!
2007-10-23 19:39
momia
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-10-15
收藏
得分:0 
你写的for循环错了。

For x = 1 To Len(CStr(lngresult))
strwant = Mid(CStr(lngresult), x, 5)
If strwant = "99999" Then
Exit For
Else: x = x + 1 ' 这里x已经加一了!!!!
End If
Next x ' 这里x又加一了!!!!

因为你每经过一次循环,你的x都会加二,所以当结果出现399991的时候你无法捕捉到。

记住以后使用for循环的时候不要随便改变计数器的内容,除非真有必要。


编程是业余爱好,写了程序自己用的。
2007-10-23 20:22
momia
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-10-15
收藏
得分:0 

我改了你的程序,调试通过了

Dim I As Integer, X As Long
Dim lngResult As Long
Dim strWant As String
I = 2
Do
lngResult = 1997& * I '这里1997后必须加&否则就在i=17时溢出,估计把 I 定义成long也
'能通过。原因自己琢磨一下,我也刚刚才明白。
For X = 1 To Len(CStr(lngResult))
strWant = Mid(CStr(lngResult), X, 5)
If strWant = "99999" Then
Exit For
' 这里删掉了 Else: X = X + 1 语句,算法错误
End If
Next X
I = I + 1
Loop Until strWant = "99999"

print i-1 '这里也不能print i,因为你跳出for以后在do循环
'最后还加一了,要把它扣掉。


[此贴子已经被作者于2007-10-23 21:32:20编辑过]


编程是业余爱好,写了程序自己用的。
2007-10-23 20:56
从菜鸟起步
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2007-9-8
收藏
得分:0 
to 8楼,我试着调试过了,果然是在i=17的时候出错,但是我不明白为什么一定要加个连接符“&",还有i最后的值是2003,为什么在i=17的时候就溢出错误了?
2007-10-24 20:39
momia
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-10-15
收藏
得分:0 

integer的范围只能为 -32,768 到 32,767 之间。当i=17的时候1997*i的乘积大于3276了。由于i定义为integer,1997没有具体的范围,在这里也可以把它当作integer,而作为加法运算符,它的返回值也就是跟随它的两个参数,
参数是integer,自然返回值就是integer了。

这里的错误是返回值溢出,就是超过了3276了。

我开始也以为lngresult足够存放就没问题了,居然返回值也有溢出的问题,这次还是我第一次碰到,我还应该谢谢
你让我多学到了新东西。

要让返回值不溢出,需要把加法运算符的参数(就是加数和被加数)的至少其中一个变成long类型。

所以只有把 1997加上&(加&是什么意思回家看看书吧),或者把i定义成long,才能使运算符返回 long值。

我也在学习中,有什么问题欢迎拿出来探讨。

[此贴子已经被作者于2007-10-24 23:47:41编辑过]


编程是业余爱好,写了程序自己用的。
2007-10-24 23:43
快速回复:报纸上的智力题
数据加载中...
 
   



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

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