找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29117|回复: 16

【出题】批处理显示一个数等于哪些2的n次方数的和

[复制链接]
发表于 2009-3-21 15:57:45 | 显示全部楼层 |阅读模式
输入一个正整数(cmd范围内)显示它是哪些2的n次方数的和。
有点说不清楚,呵。。
举几个例子
如:
8=8
15=1+2+4+8
25=1+8+16
256=256
273=1+16+256

[ 本帖最后由 随风 于 2009-3-22 01:48 编辑 ]
发表于 2009-3-21 16:58:55 | 显示全部楼层
次方运算还要自己写么。。。
2^31-1,30次,for就够用了。。。
发表于 2009-3-21 18:21:30 | 显示全部楼层
这时候就能看出位运算的强大了啊。用位运算解此题,核心代码大概不会超过5行~
 楼主| 发表于 2009-3-21 18:31:46 | 显示全部楼层

回复 3楼 的帖子

pusofalse兄所说的位运算,不知是否指获取2的n次方?
我的代码中发现用位运算还不如直接计算来的方便,到时期待兄的代码。
发表于 2009-3-21 18:36:20 | 显示全部楼层
用到了两个位运算符,右移<<和与&,计算n次方是用了<<,分解出是哪些数的和用了按位相与&~
 楼主| 发表于 2009-3-21 18:42:09 | 显示全部楼层

回复 5楼 的帖子

太期待了!!!!!!!!!!
 楼主| 发表于 2009-3-21 22:37:52 | 显示全部楼层
终于知道如何用 位运算 来作了,谢pusofalse的指点。
发表于 2009-3-22 00:50:39 | 显示全部楼层
位运算的是不是类似这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p "number=请输入一个整数:"
  3. set /a flag=1,num=0
  4. set /p=!number!=<nul
  5. for /l %%i in (1 1 31) do (
  6.     set /a a="!number! & !flag!"
  7.     if !a! equ 1 set /a b="1<<!num!" & set /p=!b!+<nul
  8.     set /a num+=1,"number>>=1"
  9. )
  10. set /p= <nul & echo.
  11. pause>nul
复制代码
只能计算2*31-1(2147483648)以内的数,没考虑负数,对于负数按补码算倒不如当成正数算,最后再加个负号。

[ 本帖最后由 lhjoanna 于 2009-3-22 01:01 编辑 ]
 楼主| 发表于 2009-3-22 01:08:58 | 显示全部楼层

回复 8楼 的帖子

是否不用这么麻烦,
另兄的代码还可精简。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "x=!random!"
  3. set /p=!x!=<nul
  4. for /l %%i in (0 1 31) do (
  5.     set /a a="x&1","x>>=1"
  6.     if !a! equ 1 set /a b="1<<%%i"&set/p=!b!+<nul
  7. )
  8. set /p= <nul & echo.
  9. pause>nul
复制代码

[ 本帖最后由 随风 于 2009-3-22 01:18 编辑 ]
发表于 2009-3-22 01:13:58 | 显示全部楼层

回复 8楼 的帖子

嗯,大家都是这个时候在线啊。
http://www.bathome.net/viewthrea ... amp;page=1#pid24217
发表于 2009-3-22 01:27:44 | 显示全部楼层
看了zqz提供的链接,我的是麻烦了,num变量可以不用的,用%%i代替就可以。汗,2行就搞定了~还有一处小问题,就是for循环中应该是 0-30就可以了吧。
发表于 2009-3-22 01:37:00 | 显示全部楼层
各位都好厉害,反倒是我的代码复杂了点~
  1. @echo Off & SetLocal EnableDelayedExpansion
  2. set "szResult="
  3. set /p "var=Input: "
  4. For /L %%a in (0 1 31) do (
  5.        set /a n = 1"<<"%%a, m = var "&" n
  6.        If !m! equ !n! set "szResult=!szResult!+!n!"
  7. )
  8. If defined szResult Echo %szResult:~1%
  9. Pause
复制代码

[ 本帖最后由 pusofalse 于 2009-3-22 01:52 编辑 ]
 楼主| 发表于 2009-3-22 01:47:47 | 显示全部楼层

回复 12楼 的帖子

哈哈,但是都是以你的思路为核心啊,大家都放出代码来吧。。。
发表于 2009-3-22 01:55:46 | 显示全部楼层
稍稍修改了下,只知1"<<"n 的结果是2的n次方,但不知1"<<"0的结果为何是1?~
结果陷入卡壳中,还计算出了“斐波那契”数列~

[ 本帖最后由 pusofalse 于 2009-3-22 02:09 编辑 ]
发表于 2009-3-22 02:00:26 | 显示全部楼层
我这里 1<<0 结果是1啊,兄如何测试的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:18 , Processed in 0.022012 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表