MyException - 我的异常网
当前位置:我的异常网» C++ » 隆重建议,以后给作业贴的提供连老师也看不懂的源代

隆重建议,以后给作业贴的提供连老师也看不懂的源代码.该如何处理(6)

www.MyException.Cn  网友分享于:2013-02-26  浏览:24次

system( "pause ");

return 0;
}

------解决方案--------------------
LS分析得很好,呵呵。

这个算法是用来做大数(大于内建类型直接支持的位数)除法的。由于只使用了比较、移位和加减法,避免了乘除法和取模。因此这个算法提供了高效率。
LS分析得很清楚了的,此外我的Blog中也有大数除法原始代码的注释,可供参考。

数学对于计算机还是很有用的,在算法中就有所体现。
期待算法方面的力作,呵呵。
------解决方案--------------------
潜力贴!,终于看到有意思的部分了。

同意ls, 期待有更多的好算法!
------解决方案--------------------
目前大家的算法还都是比较有条理的,没有用到什么特别混乱的算法。当然这个问题本来也比较简单。

混乱的代码,可以是写法上的混乱(如使用宏、混淆的变量名和缩进,以及语法中的隐秘部分),也可以是算法上的混乱,也可以是利用人的思维定势误导。其中算法上的混乱最值得一写,所以我也期待新奇的算法出现。但我觉得还是应该尽量避免写大段无用的代码(如卫亭的程度前面一段算几个常数),毕竟这种东西总能凑出来。
------解决方案--------------------
int main()
{
char sb[8];
cout < < "input number: ";
for(int i=0;i <8;++i)
sb[i] = getchar();
for(int i=0;i <8;++i)
cout < <sb[i] < < " ";
}

嘿嘿,我这个管你是不是LONG都能输出,8位就行
------解决方案--------------------
我按卫亭的算法又改了改,利用位运算去除了除法(原来有个除以10的运算),以提高效率(这本身是个高效的算法),并压缩了代码。现在这个样子可能会更难看一些,不过如果熟悉了前面的程序这个也不太难理解。

#include <stdio.h>

int main()
{
long n,x=0x2FAF0800l,p=0;
scanf( "%d ",&n);
do n> =x&&(p+=8,n-=x),n> =(x> > =1)&&(p+=4,n-=x),n> =(x> > =1)&&(p+=2,n-=x),
n> =(x> > =1)&&(++p,n-=x),printf( "%d ",p),x*=01463146315l;
while(p=0,~(x < <=2)&010l);
printf( "%d\n ",n);
return 0;
}

------解决方案--------------------
哦,有个小BUG,所有格式串 "%d "要改成 "%ld ",否则在16位的编译器下面会出错。
------解决方案--------------------
我的程序,开头的部分果然还是被批了,呵呵。

它源于一个数论上的命题,我在刚学乘法时就知道这个命题了。它很简单,真的。可是,在中学时有一次碰到以这个命题为基础的智力题,我想了很长时间才得出答案(汗……)。所以简单地未必就容易,因为简单的常常会被遗忘。所以我把它放在这里,以表达“一切的算法都是从最简单的开始的”这一感受。
至于两个magic number,纯粹是用来迷惑的,以模糊重点(不过好象没什么用,呵呵,我果然是比较老实的,骗不了人……)。第一个magic number就是为了算一个10;不过第二个确实比较巧,我想里面是有内在原因的。我的程序中唯一没有出现的数字,才是真正的魔数,我刚才所说的命题,就是描述它的性质。

milksea(航航 | 啥都不会咋办) 的程序比较强悍,与大数除法有异曲同工之妙,可以显示9位的数字,呵呵。不过我是借用,他这个是原创;所以我要说:佩服啊!

老实说,我写不出如此紧凑的代码,因为不太习惯。不过我却喜欢看紧凑的代码,不太想看大段的,可能很多人会和我一样,呵呵。我想,能把代码写短,一定是对语言和算法等等理解很深才能做到的,这方面,我要继续学习。
特别看好这句 x*=01463146315l ;这是算术和计算机低层原理的完美结合。

算法大多是高深的,但是原理都是简单的。
只要不怕麻烦,勇敢前进,你就会发现,一切都是从最基本的开始的,没什么可怕的,呵呵。
------解决方案--------------------
我哪里是原创,总的算法还是用那个二进制分解的东西,不过由于循环很少,就利用一些代码技巧把内循环直接换成四个相似的表达式了。

另外,x *= 01463146315l,这个是计算常数精确除法的一个特别高效的算法,我从《Hacker 's Delight》这本书上抄的,果然比较迷惑人,呵呵。

x *= 01463146315l(8进制比16进制看上去混乱些^^),或写为x *= 0xCCCCCCCDL,原理是作模为2^32的整数运算(这里假定long的大小是32位,在64位机器下常数需改为0xCCCCCCCCCCCCCCCDL),那个常数就是5的乘法逆元,作乘法相当于除以5。后面又有移位运算,相当于除2。注意这里用乘法代替除法的办法只适用整除的情形。

参考:《Hacker 's Delight》第10章。
------解决方案--------------------
其实最后讨论下来,这个问题的算法就是二进制数到十进制数的转换问题。这种转换问题当然是有很成熟高效的算法的,为此我查阅了TAOCP。现在这个算法就改编自TAOCP第二卷上的算法和后面的一个习题,当然在输出方面用了一点小花招。算法本身是十分平凡的:不断除以10,求余数。但除法全部用加减法和位运算代替了。输出利用了一个很短的栈,为了输出空格又做了一点变化。

必须指出的是,这个算法的确是十分高效的。除了压缩代码,我没有加入多余的混淆代码,因为它本身已经不容易理解了。

本程序为32位整数而写,但容易改为64位整数的程序。

#include <stdio.h>

main()
{
char s[20]={32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0},
*p=s+18;
unsigned __int32 u,v,q,r; /* 若支持C99可用uint32_t,__int32一般可用long代替 */

文章评论

每天工作4小时的程序员
每天工作4小时的程序员
10个调试和排错的小建议
10个调试和排错的小建议
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何成为一名黑客
如何成为一名黑客
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
旅行,写作,编程
旅行,写作,编程
编程语言是女人
编程语言是女人
老程序员的下场
老程序员的下场
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员的鄙视链
程序员的鄙视链
我的丈夫是个程序员
我的丈夫是个程序员
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员和编码员之间的区别
程序员和编码员之间的区别
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
鲜为人知的编程真相
鲜为人知的编程真相
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
 程序员的样子
程序员的样子
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我是如何打败拖延症的
我是如何打败拖延症的
那些争议最大的编程观点
那些争议最大的编程观点
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
一个程序员的时间管理
一个程序员的时间管理
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
中美印日四国程序员比较
中美印日四国程序员比较
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
漫画:程序员的工作
漫画:程序员的工作
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员都该阅读的书
程序员都该阅读的书
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有