| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 936 人关注过本帖
标题:C语言中,类似 if(2*x==8)的运算,都需要想办法给定一个取值范围,让程序一 ...
只看楼主 加入收藏
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:12 
C语言中,类似 if(2*x==8)的运算,都需要想办法给定一个取值范围,让程序一个个去验证才行吗?
(1)https://bbs.bccn.net/thread-457083-1-1.html
上一篇帖子,我贴的程序中

刚发现估计就是因为我的程序没有给出一个大致的取值范围,只是给出一个空洞的式子:if((1.0-1/5.0-5/7.0)*n==303.0)
编译器无法进行穷举代入验证,所以没有结果输出

而书本给的程序想方设法给出一个x,让程序去穷举循环代入,验证哪个结果合适,不过这个x至今没看懂,怎么来的,怎么设定?

(2)类似的问题,刚又碰到一个:
一个塔高8层,下面一层灯的数量是上面一层的两倍,8层公共有765盏灯
然后我直接:if(255*x==765)  发现没法求啊
太坑爹了

最后,不吐槽了,想请教一下大家:
类似的情况该怎么处理?
比如第一篇,我帖子里面https://bbs.bccn.net/thread-457083-1-1.html   里面的x怎么设想出来的?这种参数的设想和假设有没有较好的方法?

[ 本帖最后由 计算机之祖 于 2015-9-8 11:16 编辑 ]
2015-09-08 00:30
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
回复 2楼 边小白
还早着呢

剑栈风樯各苦辛,别时冰雪到时春
2015-09-08 07:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
一个塔高8层,下面一层灯的数量是上面一层的两倍,8层公共有765盏灯
一个塔高8层,下面一层灯的数量是上面一层的两倍,8层总共有765盏灯,请问第一层灯的数量是多少?
printf( "%d\n", 765/((1<<8)-1) );

2015-09-08 08:35
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
2^0*n+2^1*n+2^2*n+......2^7*n  =  n*(2^0+......2^7)=765   接下来请百度 指数数列求和
                               => n*(2^7*2-1)/(2-1)=765
                               => n=3

DO IT YOURSELF !
2015-09-08 09:01
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
收藏
得分:0 
回复 2楼 边小白
说白了就是数学思想和编程思想的冲突吧
数学思想如:一般给个方程,比如2*x=10,按数学算,一秒钟就出来了
但是编程思想:如果直接if(2*x==10),然后指望程序给你直接算出来,至少我发现C是不行的
所以这是我之前犯的一个错误

所以我们得给这个if()式子设定一个循环条件,让它逐个代入数值去计算,说白了这种方法对人脑来说是最笨的方法,但是C貌似就得这么干才行

但是有个问题就是有时候,你用数学不能很简单算出对应x的值,但是你又想给x或者与x相关的参数设定一个取值范围,以便让程序去穷举循环的话
这个时候,就有点犯难了

这就是我最想问的问题
2015-09-08 11:15
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
收藏
得分:0 
回复 5楼 wp231957
这个还好吧
高中数学我还是不错的
不过我上面貌似真的算错了,应该是255*x==765,已改,谢谢

对于 if(255*x==765)这样的式子,是否一定得给这里的x或者和x相关的参数设定一个取值范围,让程序去循环穷举,依次代入验证
这个在人脑看来最笨的方法,貌似C中只能这么干了

但是有个问题就是有时候,你用数学不能很简单算出对应x的值,但是你又想给x或者与x相关的参数设定一个取值范围,以便让程序去穷举循环的话
这个时候,就有点犯难了

这就是我最想问的问题
2015-09-08 11:22
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
收藏
得分:0 
回复 4楼 rjsp
亲,位移运算比较强大,程序显得简便多了

但是问个问题:
万一您这个除不尽呢?不需要考虑将变量定位float,然后按float去计算吗?
2015-09-08 11:25
xnattack
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-9
收藏
得分:0 
回复 8楼 计算机之祖
我可能比你还新手一些,我真看不懂这个位移运算是怎么实现的,能讲解一下吗?
2015-09-10 11:54
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
收藏
得分:0 
回复 9楼 xnattack
1<<8
前面是操作数1,中间<<表示左移,后面的8表示:左移8位
为了方便解释,假设它是short 2个字节的
那么1用二进制表示为0000 0000 0000 0001
左移八位之后变成: 0000 0001 0000 0000
原来是1,现在2^8

每左移一位实际上相当于将原来的数*2
依次……

如果右移的话,就是除以2,原理是一样的
2015-09-12 08:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 楼主 计算机之祖
计算机就是解决没有现成数学公式问题的。有数学式的,直接用手解就可以了,犯不着编程。编程很多时候是用于验证,比如1+2+3+……+100=5050,你可以总结出数学公式,或者别人告诉你公式,但你并不清楚这个公式对不对,那么就可以用计算机来验证,这个验证就肯定不能再用这个公式(那叫循环论证),只有通过死算得到相同的结果,你才会相信这个数学结论是对的。那种老是想着先做数学运算再编程的思维,其实已经歪曲了计算机的用途。编程,也用不着那么多的数学知识。

1+2+3+……+100这个例子很简单,但这祗是举例,有些事情是你不懂专业知识造成的,就如你不知道这个加法有现成的公式,别的很多事情,也可能是你不知道有没有公式的,这个时候,才是计算机发挥作用的时候——计算机就是用于死计算,这是它的本质。再比如稍微复杂点的,定积分,这个名词很高级吧?你极可能不懂,但只要懂的,就知道那不过是最普通的加法罢了,连乘法都用不着,但要你用数学公式去算,却未必总能算得出来,求不定积分的技巧有多诡异,熟悉数学的都知道,但对计算机来说,这根本就是小儿科。

诸如求素数的循环可以到某个根号数为止,也是数学上的现成结论,但对编程者来说,知不知道有这样的结论并不妨碍你得到正确答案的。不知道圆周率的值,也可以算出圆的面积,别说是圆,不管多复杂、多么没有数学规律的曲线,也可以用同样简单的算法得出结果,这当然没有玩数学那么刺激,但实用。事实上,现实绝大多数事情,都有更多更好的方案可以完成任务,只懂数学的,反而会想歪,就如大学生被问到1+1=?要花两小时才能得到答案一样,那是路子太窄。

编程是艺术,不是科学,更不是数学。这是我不止一次说过的,也不是只有我才说这样的观点,信不信由你。

[ 本帖最后由 TonyDeng 于 2015-9-12 13:41 编辑 ]

授人以渔,不授人以鱼。
2015-09-12 13:30
快速回复:C语言中,类似 if(2*x==8)的运算,都需要想办法给定一个取值范围,让程 ...
数据加载中...
 
   



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

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