【问题标题】:Using an if statement inside a for loop在 for 循环中使用 if 语句
【发布时间】:2014-03-13 23:59:59
【问题描述】:

我正在尝试制作一个批处理文件来解决第一个 Project Euler 问题http://projecteuler.net/problem=1,但我需要在循环中使用 if 语句来检查 n 模 3 或 5 是否为 0。总和突然停止工作.

我的代码:

echo off

set sum=0
for /l %%n in (1,1,999) do (
    set a/ sum+=%%n *(only add if n%%3 == 0 or n%%5 == 0)*
)

echo %sum%
pause

【问题讨论】:

    标签: batch-file if-statement for-loop


    【解决方案1】:

    总和突然停止工作。

    我认为您的总和停止工作是因为您的 set 需要在“a”前面而不是后面有斜线,如下所示:

    SET /A sum+=%%n
    

    此外,DOS Batch 中没有 OR 运算符,因此您需要为此使用嵌套的 IF。这对我有用:

    echo off
    
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    set sum=0
    for /l %%n in (1,1,999) do (
    
        SET /A mod3=%%n%%3
        SET /A mod5=%%n%%5
    
        IF !mod3!==0 (
            SET /A sum+=%%n
        ) ELSE (
            IF !mod5!==0 (
                SET /A sum+=%%n
            )
        )
    )
    echo %sum%
    ENDLOCAL
    

    如果您需要更多帮助,请查看 Rob van der Woude 的脚本页面。具体来说,这里是他关于执行mathematical operations in DOS batch files的页面的链接。

    【讨论】:

      【解决方案2】:
      @ECHO OFF
      SETLOCAL
      
      set /A sum=0
      for /l %%n in (1,1,999) do (
       CALL :modulo %%n
       IF DEFINED addme set /a sum+=%%n
      REM CALL echo %%n %%sum%% %%addme%%
      )
      
      echo %sum%
      
      GOTO :EOF
      
      :modulo
      :: set addme if %1 %% 3 == 0 or %1 %% 5 == 0
      SET /a addme = %1 %% 3
      IF %addme%==0 GOTO :EOF 
      SET /a addme = %1 %% 5
      IF %addme%==0 GOTO :EOF
      SET "addme="
      GOTO :eof
      

      只需将每个值依次传递给:modulo 例程,并将标志值设置为(清除或不清除)

      @ECHO OFF
      SETLOCAL enabledelayedexpansion
      
      set /A sum=0
      for /l %%n in (1,1,999) do (
       SET /a mod=%%n %% 3
       IF NOT !mod!==0 SET /a mod=%%n %% 5
       IF !mod!== 0 set /a sum+=%%n
      rem CALL echo %%n %%sum%%
      )
      
      echo %sum%
      
      GOTO :EOF
      

      使用延迟扩展做同样的事情。

      【讨论】:

        【解决方案3】:

        这是一个非常有效的解决方案,虽然有点混淆:

        @echo off
        setlocal
        set /a sum=0
        for /l %%N in (1 1 999) do set /a "sum+=%%N/!((%%N%%5)*(%%N%%3))" 2>nul
        echo %sum%
        

        如果%%N 可被 3 或 5 整除,则表达式 (%%N%%5)*(%%N%%3) 产生零,如果不能被其中任何一个整除,则表达式为非零。 ! 采用逆逻辑值,因此 0 变为 1,非零变为 0。将 %%N 除以该表达式会产生 %%N 或除以零错误。因此,只需将整个表达式添加到总和中,并将错误消息重定向到 nul。

        最终结果 - 仅添加可被 3 或 5 整除的数字 :-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-02
          • 2013-08-26
          • 2014-08-25
          • 2013-05-28
          • 1970-01-01
          • 1970-01-01
          • 2023-01-13
          相关资源
          最近更新 更多