在for循环中使用if语句

时间:2014-02-14 14:53:36

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

我正在尝试创建一个批处理文件来解决第一个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

3 个答案:

答案 0 :(得分:5)

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

@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%%5)*(%%N%%3)可以被3或5整除,则表达式%%N会产生零,如果它不能被整除,则表达式为非零。 !取反逻辑值,因此0变为1,非零变为0.将%%N除以该表达式会产生%%N或除以零错误。因此,只需将整个表达式添加到总和中,然后将错误消息重定向到nul。

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

答案 1 :(得分:0)

  

总和突然停止了工作。

我认为你的总和已停止工作,因为你的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的Scripting页面。具体来说,这是指向执行mathematical operations in DOS batch files的页面的链接。

答案 2 :(得分:0)

@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例程,并将标志值设置为(清除与否)

OR

@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

使用delayedexpansion做同样的事情。