我正在尝试创建一个批处理文件来解决第一个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
答案 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做同样的事情。