2014-02-14 227 views
2

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

我的代码:

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 

回答

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)产生零,如果%%N是3或5,或非零整除,如果它不是由任一整除。 !取反逻辑值,所以0变为1,非0变为0.用该表达式除%%N得到%%N或除零误差。因此,只需将整个表达式添加到总和中,并将错误消息重定向到nul。

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

+0

+1 This。是。真棒。 – Aaron

+0

精彩的回答。 :) – Iqbal

0

而且总和已经突然停止工作。

我觉得你和停止工作,因为你set需要有斜线的“A”的前面,而不是它背后,是这样的:

SET /A sum+=%%n 

而且,没有一个OR运算符在DOS批处理,所以你需要使用嵌套的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

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同样的事情。