【问题标题】: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 整除的数字 :-)