批处理之家's Archiver

tyc 发表于 2009-4-7 10:38

选择排序法

[code]@echo off
setlocal enabledelayedexpansion
::选择排序法
echo 共输入10个数
for /l %%i in (1,1,10) do (
set /p a_%%i=请输入%%i个数
set str=!str! !a_%%i!
)
echo %str%
for /l %%i in (1,1,9) do (
set /a b=%%i+1
for /l %%j in (!b!,1,10) do (
   if !a_%%i! gtr !a_%%j! (
      set /a t=a_%%i
      set /a a_%%i=a_%%j
      set /a a_%%j=t
    )
)
)
for /l %%i in (1,1,10) do (
set str1=!str1! !a_%%i!
)
echo %str1%
pause>nul[/code]

sjzong 发表于 2009-4-9 00:45

【程序14】题目:将一个正整数分解质因数。

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:分解质因数实际就是把这数除以素数列(2 3 5 7 11 13……),从2开始除,不整除的话,换下一个素数;整除的话,就记下该数字,并求出商;若商不为1,则再把商去除素数列;商为1,就停止,表明分解结束。
由于素数列第一个数为2,后面为奇数组,所以进行判断时,等于2时就加1,不等于2时就加2,这里面有个问题就是多进行无用循环,如9 15等!还有结果是,例如:输入90,打印出90=1*2*3*3*5。
[code]
@echo off&setlocal EnableDelayedExpansion
set /p num=请输入要因数分解的数:
set str=!num!=1
:a
set /a n=2
:b
set /a aa=!num! %% !n!
::这if语句是能整除的语句,求出商,并记下那个质数n
if !aa! equ 0 (
  set /a num=!num!/!n!
  set str=!str!*!n!
::等于1,分解结束,跳到c,不等于1,继续把商除以素数列,跳到a
  if !num! neq 1 (goto :a) else (goto :c)
)
::这if语句是不能整除的,换下一个素数,并跳到b
if !aa! neq 0 (
::若等于2时n+1,不等于2时n+2
  if !n! equ 2 (set /a n=!n!+1) else (set /a n=!n!+2)
  goto :b
)
:c
echo 分解完是:!str!
pause[/code]

[[i] 本帖最后由 sjzong 于 2009-4-9 00:53 编辑 [/i]]

sjzong 发表于 2009-4-10 09:57

【程序84】题目:一个偶数总能表示为两个素数之和。

程序分析:这个偶数应该是大于3的偶数,但是大于3的偶数中4是比较特殊的,可拆为两个2的和;其他的偶数一定要拆成两个奇数的和,然后分别判断这两个数是否为素数即可。[code]
@echo off
setlocal enabledelayedexpansion
::原创:sjzong
set /p num=请输入大于3的偶数:
set /a aa=!num! %% 2
rem 判断输入的数字是否为偶数
if !aa! neq 0 (
cls
echo 你输入的数字不是偶数!
set /p num=请再次输入大于3的偶数:
)
rem 判断输入的数字是否小于等于3
if !num! leq 3 (
cls
echo 你输入的数字小于4!
set /p num=请再次输入大于3的偶数:
)
rem 判断输入的偶数是否为4,是的话直接拆分为两个2的和,不是的话进行两个奇数的拆分。
if !num!==4 (echo 偶数 !num! 是素数 2 与 2 的和。) else (
set /a yiban=!num!/2
rem 拆分偶数时只需从3到该偶数的一半即可
for /l %%a in (3 2 !yiban!) do (
  set /a shu=!num!-%%a
  set /a a1=0
  set /a a2=0
  call :test %%a
  if !flag!==1 set /a a1=1
  call :test !shu!
  if !flag!==1 set /a a2=1
  if !a1!==1 if !a2!==1 echo 偶数 !num! 是素数 %%a 与 !shu! 的和。
)
)
pause
goto :eof
rem 判断该数是否为素数时,只需计算从1到该数的一半能被该数整除的次数
rem 次数为1时表示为素数,次数大于1时表示不是素数
:test
  set /a flag=1
  set /a b=%1/2
  set /a count=0
  for /l %%a in (1 1 !b!) do (
   set /a yushu=%1 %% %%a
   if !yushu! equ 0 set /a count=!count!+1
   if !count! gtr 1 (set /a flag=0 & goto :eof)
  )[/code]

[[i] 本帖最后由 sjzong 于 2009-4-10 10:01 编辑 [/i]]

tyc 发表于 2009-4-10 10:30

八进制转十进制

[code]
@echo off
setlocal enabledelayedexpansion
::判断是否为八进制,共几位
:1
set /p bb=请输入八进制整数:
set /a aa=%bb%
set /a n=0
:2
set b=%aa:~,1%
if %b% gtr 8  goto :1
set /a n=n+1
set aa=!aa:~1!
if "%aa%" neq "" goto :2
::echo %n%
::利用权值,求各位十进制值并累加
:3
set /a n-=1
set /a c=%bb:~0,1%
for /l %%i in (1,1,%n%) do set /a c*=8
set /a t+=%c%
set bb=%bb:~1%
if "%bb%" neq "" goto :3
echo %t%
pause>nul
[/code]

[[i] 本帖最后由 tyc 于 2009-4-10 10:33 编辑 [/i]]

tyc 发表于 2009-4-12 11:54

十进制转任意进制

[code]@echo off
set /p x=要转换的数:
set /p y=要转换的进制:
call :10 %x% %y%
pause>nul
goto :eof
:10
set/a t=%1/%2
if %t% gtr 0 call :10 %t% %2
set /a b=%1%%%2
set /p=%b% <nul[/code]

[[i] 本帖最后由 tyc 于 2009-4-12 12:17 编辑 [/i]]

apchyo11 发表于 2009-5-3 17:45

精华啊。。 我很是喜欢!!

bath 发表于 2009-5-28 19:01

好了,我承认,你们都是神!
一个菜鸟瞠目结舌,蹚乎其后

tianzhizhouyin 发表于 2009-6-25 18:46

看到我都快头晕了,不过很好很强大。

sjzong 发表于 2009-6-28 23:22

回复 1楼 的帖子

【程序69】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
改一下:设有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,打印出出列的顺序。[code]@echo off&setlocal enabledelayedexpansion
:n
cls
set /p n=请输入人数n:
echo.%n%|findstr "^[1-9][0-9]*$">nul||goto n
:m
set /p m=请输入报数m:
echo.%m%|findstr "^[1-9][0-9]*$">nul||goto m
for /l %%a in (1 1 %n%) do (if %%a lss 10 (set str=!str! 0%%a) else (set str=!str! %%a))
set/a b=3*!m!-3
set/a c=3*!m!
:loop
if "!str:~%b%,3!" equ "" (set s1= 空) else (set s1=!s1!!str:~%b%,3!)
if "!str:~%c%,3!" equ "" (set str=!str:~0,%b%!) else (set str=!str:~%c%!!str:~0,%b%!)
set/a n-=1
if not !n! lss !m! goto loop
echo 出列的数据是:!s1:~1!&set s1=
if !m! equ 1 (echo 剩下的数据是:空&set str=) else (echo 剩下的数据是:!str:~1!&set str=)
pause>nul&goto n[/code]

sxqylz 发表于 2009-7-22 19:29

就是需要这样的贴子啊,给新手们的帮助太大了,看完了教程就得要这样的东西来练练

keen 发表于 2009-7-22 19:41

回复 104楼 的帖子

其实本论坛,还有很多给新手出的题目,在 新手练功区 版块。

xwk003 发表于 2009-7-25 16:48

来学学,本是也不会

正在找人教

nopr 发表于 2009-8-4 22:12

答题::组成多少个互不相同且无重复数字的三位数?

程序1[code]@ECHO OFF
setlocal enabledelayedexpansion
for /l %%i in (1,1,4) do (
     for /l %%j in (1,1,4) do (
         for /l %%k in (1,1,4) do (
                 if not %%i==%%j (
                     if not %%i==%%k (
                         if not %%j==%%k echo %%i%%j%%k)
                           )
                           )
                           )
                           )
pause[/code]

[[i] 本帖最后由 nopr 于 2009-8-5 20:39 编辑 [/i]]

nopr 发表于 2009-8-5 20:37

答题::判断这一天是这一年的第几天?

[code]@ECHO OFF
setlocal enabledelayedexpansion
:1
echo 查询日期请介于1900和2200年之间
ping /n 1 127.1>nul
set /p b=请输入年份:....

if %b% leq 1900 echo 你输入年份不符合要求,请重新输入!&ping /n 2 127.1>nul&cls&goto 1
if %b% gtr 2200 echo 你输入年份不符合要求,请重新输入!&ping /n 2 127.1>nul&cls&goto 1
:2
cls
set /p b1=请输入月份:
if %b1% lss 1 goto 2
if %b1% gtr 12 goto 2
:3
cls
set /p b2=请输入日期:
if %b2% lss 1 goto 3
if %b2% gtr 31 goto 3
cls&set /a b3=%b1%-1
call :4
for /l %%i in (1,1,%b3%) do (
         for %%j in (1 3 5 7 8 10 12) do (
             if %%i == %%j (set /a a+=31)
             )
         for %%k in (4 6 9 11) do (
             if %%i == %%k (set /a a1+=30)
             )
             )
for /l %%h in (1900 4 2200) do echo %%h>>a.txt
find "%b%" a.txt >nul && (set /a a2=%a1%+29) || set /a a2=%a1%+28
set /a a3=%a%+%a2%+%b2%
echo 你要查询的日期是%b%的第%a3%天
del a.txt&pause>nul&goto :eof
:4
for /l %%y in (1 1 20) do (
     set /p=*<nul
     for /l %%z in (1 1 500) do ver>nul
     )
cls
goto :eof[/code]

nopr 发表于 2009-8-6 15:19

题目:输出9*9口诀

[code]@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do (
     echo.
     for /l %%j in (1,1,9) do (
     set /a aa=%%i*%%j
     set a=%%jx%%i=!aa!
     if %%j leq %%i set/p=!a! <nul
     )
     )
pause>nul[/code]

nopr 发表于 2009-8-6 16:25

题目:要求输出国际象棋棋盘。

[code]@echo off
setlocal enabledelayedexpansion
:1
set/a b+=1
for /l %%j in (1 1 4) do (
     set a=□■
     set/p=!a!<nul)
echo.
for /l %%i in (1 1 4) do (
     set a1=■□
     set/p=!a1!<nul)
echo.
if %b% geq 4 pause>nul&goto :eof
call :1[/code]

就是棋盘有点小!

wangshuping42 发表于 2009-9-30 14:33

以下是我写的几个程序

**********************************************************************************
【程序1】
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
**********************************************************************************
[color=#0000ff][code]
@echo off
for %%i in (1 2 3 4) do (
   for %%j in (1 2 3 4) do (
      if %%j neq %%i (
         for %%k in (1 2 3 4) do (
   if %%k neq %%i (
      if %%k neq %%j (echo %%i%%j%%k)
)
                     )
               )
        )
)
pause>nul
[/code][/color]
**********************************************************************************
【程序2】
输入某年某月某日,判断这一天是这一年的第几天?  
**********************************************************************************
[color=#0000ff][code]@echo off
set days=0&setlocal enabledelayedexpansion
set /p date=请输入日期(日期格式 xxxx.xx.xx):
for /f "tokens=1,2,3 delims=./ " %%i in ("%date%") do (
     set "year=%%i"&set "month=%%j"&set "day=%%k"
     set "run=%%j"
  )
for %%l in (0 31 28 31 30 31 30 31 31 30 31 30 31) do (
    set /a days=days+%%l
    set /a month=month-1
    if !month! equ 0 (goto a)
)
:a
set /a days=%day%+!days!
if %run% equ 1 (goto b)
set /a b=year%%400
set /a c=year%%4
set /a d=year%%100
if %b% equ 0 (set /a days=1+days&goto b)
if %c% equ 0 (
   if %d% neq 0 (
      set /a days=1+days
    )
)
:b
echo %date% 是 %year% 年的第 %days% 天
pause>nul[/code][/color]
**********************************************************************************
【程序3】
输出9*9口诀。
**********************************************************************************

[color=#0000ff][code]@echo off&set n=0
for /l %%i in (1 1 9) do (
    set a=%%i
for /l %%j in (1 1 9) do (
    set b=%%j
    call :a
   )
    echo.
)
pause>nul
:a
if %b% gtr %a% (goto :eof)
set /a num=a*b
set /p "=%a%x%b% = %num% " <nul
set /a n=n+1
goto :eof[/code][/color]

[color=blue][color=black]**********************************************************************************
【程序4】
输出101-200之间所有的素数。
**********************************************************************************[/color] [/color]
[color=blue][/color]
[color=blue][code]@echo off
for /l %%i in (101 1 200) do (
    set a=%%i &set n=0
    call :calc
)
pause>nul
:calc
for /l %%j in (2 1 15) do (
    set b=%%j
    call :op
   )
if %n% equ 0 (echo %a%)
goto :eof
:op
set /a yu=a%%b
if %yu% equ 0 (set n=1)
goto :eof[/code][/color]
[color=#0000ff][/color]

**********************************************************************************
【程序5】
打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1^3+5^3+3^3
**********************************************************************************
[color=#0000ff][code]@echo off
for /l %%i in (1 1 9) do (
        set a=%%i
  for /l %%j in (0 1 9) do (
        set b=%%j
    for /l %%k in (0 1 9) do (
        set c=%%k
        set num=%%i%%j%%k
        call :calc
        )
    )
)
pause>nul
:calc
set /a sum=a*a*a+b*b*b+c*c*c
if %num% equ %sum% (echo %num%)
goto :eof[/code][/color]

[color=blue][color=black]**********************************************************************************
【程序6】
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。  
**********************************************************************************[/color] [/color]
[color=blue][code]@echo off
set n=1
set /p num=请输入一个数字:
set /p "=%num%=" <nul
:start
for /l %%i in (2 1 %num%) do (
   set a=%%i
   call :sp
)
pause>nul
:sp
set /a yu=num%%a
set /a sh=num/a
if %yu% equ 0 (
   set /a num=sh
   if %n% neq 1 (set /p "=*" <nul)
   set /p "=%a%" <nul & set n=0
   goto start
)[/code][/color]
[color=#0000ff][/color]
[color=#0000ff][/color]

**********************************************************************************
【程序7】
输入两个正整数m和n,求其最大公约数和最小公倍数。
**********************************************************************************
[color=#0000ff][code]@echo off
set /p n=请输入数字 n=
set /p m=请输入数字 m=
if %m% gtr %n% (
  set /a min=n & set /a max=m
      ) else (
  set /a min=m & set /a max=n
  )
for /l %%i in (%min% -1 1) do (
   set a=%%i
   call :sp
)
:an
echo 最大公约数是 %a%
echo 最小公倍数是 %b%
pause>nul &exit
:sp
set /a y1=n%%a
set /a y2=m%%a
set /a s=max%%min
if %s% equ 0 (
    set /a b=max ) else (
      set /a b=max*min
      )
if %y1% equ 0 (
  if %y2% equ 0 (
    if %y1% equ %y2% (goto an)
    )
)[/code][/color]

[[i] 本帖最后由 wangshuping42 于 2009-9-30 14:36 编辑 [/i]]

dominater 发表于 2009-10-12 22:49

好帖子 用来练习for再好不过 对我学习c++也有极大帮助啊

starjaymy 发表于 2009-10-16 11:18

这好像不适合新手做吧。。

基拉freedom 发表于 2009-10-16 19:44

好久没来了
稍微做几题:
第一题 记得用递归可以做...但这里就用for了[code]@echo off
for /l %%i in (1 1 4) do (
for /l %%k in (1 1 4) do (
if %%i neq %%k (
        for /l %%j in (1 1 4) do (
        if %%j neq %%i if %%j neq %%k (
    for /l %%x in (1 1 4) do (
    if %%x neq %%j if %%x neq %%i if %%x neq %%k echo %%i%%k%%j%%x
    )
        )
        )
)
)
)
pause[/code]乘法表是什么东西??看看对不对[code]@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 1 9) do (
for /l %%k in (1 1 %%i) do (
set /a a=%%k *%%i
set a= !a!
set a=!a:~-2!  
set g=!g!"%%k*%%i=!a!"
)
echo !g:"=!
set a=
set g=
)
pause[/code]水仙花树
9*10*10=900 效率差不多吧??[code]@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 1 9) do (
for /l %%k in (0 1 9) do (
for /l %%j in (0 1 9) do (
set /a a=%%i*100+%%k*10+%%j
set /a b=%%i*%%i*%%i+%%k*%%k*%%k+%%j*%%j*%%j
if !a! equ !b! echo 百位 %%i  十位 %%k  各位 %%j
)
)
)[/code]就只做这么多了 用其他语言都做过了 呵呵 回味一下
不错

vsbat 发表于 2009-10-17 19:25

程序1:
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
      掉不满足条件的排列。[code]@echo off
set a=0
for /l %%i in (1 1 4) do (
      for /l %%j in (1 1 4) do ( if %%i neq %%j (
            for /l %%k in (1 1 4) do if %%i neq %%k (
                     set/a a=a+1&if %%k neq %%j   echo %%i  %%j  %%k))))
echo       共 %a% 个
pause
                                                  
                                                  [/code]先做一个题----^-^

[[i] 本帖最后由 vsbat 于 2009-10-17 19:27 编辑 [/i]]

tuifei 发表于 2009-10-17 19:36

tuifei  来学习·····

ghostwar 发表于 2009-10-24 06:45

感觉好难咯!
   继续努力!
  楼主你等我的答案哈!

loveyuto 发表于 2009-10-26 20:44

回复 32楼 的帖子

楼主的好像不太对哟。[code]@echo off&setlocal EnableDelayedExpansion
echo 倒数第1天时有1个桃子
set a=1
for /l %%i in (2,1,10) do (
set /a a=a+1
set /a a=a*2
echo 倒数第%%i天时有!a!个桃子)
pause[/code]

loveyuto 发表于 2009-10-26 20:57

回复 32楼 的帖子(关于猴子吃桃问题)

[code]@echo off&setlocal EnableDelayedExpansion
set a=1
for /l %%i in (2,1,10) do (
echo 倒数第%%i天时有!a!个桃子
set /a a=a+1
set /a a=a*2
)
pause[/code]

loveyuto 发表于 2009-10-26 21:04

关于猴子吃桃问题

不好意思,刚才打错了一个数字[code]@echo off&setlocal EnableDelayedExpansion
set a=1
for /l %%i in (1,1,10) do (
echo 倒数第%%i天时有!a!个桃子
set /a a=a+1
set /a a=a*2
)
pause[/code]

vsbat 发表于 2009-11-1 20:10

[quote] set/a res=%%a*%%b
                set "res=!res!  " %======此处用来对齐=========%
                set/p=%%ax%%b=!res:~0,2!  <nul   [/quote]

7 楼的这个 对齐 真是让人学习啦------------每次 res  都是两个字符----
这样在 3x3=9  4x3=12 处就都对得齐了---------

vsbat 发表于 2009-11-1 21:01

**********************************************************************************
【程序37】
题目:对10个数进行排序
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,
      下次类推,即用第二个元素与后8个进行比较,并进行交换。
**********************************************************************************[code]@echo off
setlocal enabledelayedexpansion
for /l %%l in (1 1 10) do set /p a%%l=请输入第%%l个数:
for /l %%k in (1 1 9) do (
set max=%%k
for /l %%i in (%%k 1 10) do (call,set mm=%%a!max!%%&if !a%%i! gtr !mm! (set max=%%i))
call,set t=%%a!max!%%&set a!max!=!a%%k!&set a%%k=!t!)
echo\
echo 从大到小排序后如下:
for /l %%j in (1 1 10) do echo !a%%j!
pause>nul[/code]::选择法排序
::原理是设序号max它代表最大数的序数,先假设max为1----然后把他与其他一一比较---比它大就把那个数的序号赋给max--这样从1到9比较下来最大的数的序数就确定下开了--然后把它与a1交换==
使其为首位----然后利用循环 对 从2开始的数重复此过程---把第二大的数挑出来--
一直到第9大的数,即外循环是9次
从而实现从大到小排序----------
代码中注意--变量嵌套==

[[i] 本帖最后由 vsbat 于 2009-11-1 21:03 编辑 [/i]]

naiveboy520 发表于 2009-11-3 00:01

回复 3楼 的帖子

我要看答案   没办法了

foxJL 发表于 2009-11-3 19:09

[quote]原帖由 [i]huajinghua[/i] 于 2008-4-11 19:48 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=3737&ptid=850][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
【程序21】
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
   的一半零一个。到 ... [/quote]
兄弟你这题想得不够周全,若依你的答案,倒数第二天时剩3只桃子,倒数第一天是否只剩半只?
桃子总数应该是1534只[code]@echo off&setlocal EnableDelayedExpansion
set a=1
for /l %%i in (2,1,10) do (
set /a a+=1,a*=2
echo 倒数第%%i天时有!a!个桃子)
pause[/code]

页: 1 2 3 [4] 5 6

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.