2016-08-02 7 views
5

新しいこととして、バッチスクリプト(https://projecteuler.net/problem=5)を使用して、プロジェクトオイラー問題5を完了しようとしています。しかしながら;私はいくつかの問題にぶつかってきました。もし誰かが私のコードを乗り越えることができれば、それは素晴らしいだろう。行うことに意味は何バッチスクリプト内でモジュラス演算を実行する

@ECHO off 

SET init=1 
SET iter=1 
SET /a func=%init% %% %iter% 
cls 

:Num 
IF func==0 (
    IF iter==20 (
     ECHO Val = %init% 
     pause 
     exit 
    ) ELSE (
     SET /a iter+=1 
     GOTO Num 
    ) 
) ELSE (
    SET iter=1 
    SET /a init+=1 
    GOTO Num 
) 

init mod iterは0を返し、それがない場合、それはしかし、21に到達するまで、iter値に1を加えるかどうかをチェックしています。 0に等しくなければ、反復カウントは0に設定され、再び計算が開始されます。


起こることを意味しているものの例:

1 mod 1 = 0, Therefor add 1 to iter 
1 mod 2 != 0, Therefor init is set to 0 and 1 is added to init 
2 mod 1 = 0, Therefor add 1 to iter 
2 mod 2 = 0, Therefor add 1 to iter 
2 mod 3 != 0, Therefor init is set to 0 and 1 is added to init 

などなどなど。


起こる何をするかの例:

1 mod 1 != 0, Therefor add 1 to init 
2 mod 1 != 0, Therefor add 1 to init 
3 mod 1 != 0, Therefor add 1 to init 

などなどなど。



ご協力いただきありがとうございます。 (!?):これについてどのように

+0

私はコードを少し変更しましたが、今度はモジュラス計算を完全にスキップし、1 mod 1〜20 = 0と言います。なぜこれを行うのか? オフ '@ECHO initのSET = 1 SET ITER = 1 SET/FUNC = "%INIT%%%%ITER%" CLS: "%のFUNC%の" IF民 ==「0 「( \t IF "%%ITER" == "21"( \t \tエコー。 \t \t ECHOヴァル=%のinit% \t \tエコー。 \t \tプレス終了する任意のキーをエコーする。。。 \t \t p ause> nul \t \t exit \t)ELSE( \t \t echo%init%mod%iter%= 0; CONT \t \t SET/ITER + = 1 \t \t GOTO民 \t) )ELSE( エコー%INIT%MOD%ITER%!= 0; \t SET ITER = 1 \t SET/INIT + = 1 \t GOTO民 )醜い書式のため申し訳ありません ' を破ります。 – Sennsei

+3

あなたは決して '%func%'を再計算しません。 – SomethingDark

+0

これはどのように組み込むのですか? – Sennsei

答えて

0

@Echo off 
setlocal enabledelayedexpansion 
SET init=1 
SET iter=1 
cls 
set loopCounter=1 
set loopBatch=1 

:numLoop 
SET /a func="!init! %% !iter!" 
IF !iter! == 21 (goto :done) 
IF !func! == 0 (call :incIter) ELSE (call :incInit) 
SET /a loopCounter+=1 
SET /a loopBatch="%loopCounter% %% 1000" 
if !loopBatch! == 0 (echo %loopCounter% iterations done) 
goto :numLoop 

:incInit 
    rem echo %init% mod %iter% == %func%; Increasing init 
    SET iter=1 
    SET /a init+=1 
    goto :eof 

:incIter 
    rem echo %init% mod %iter% == %func%; Increasing iter 
    SET /a iter+=1 
    goto :eof 

:done 
    echo. 
    ECHO Val = %init% 
0

ただ、誰かがそれ "役に立つ" 見つけることができる場合は、 "現実的な" 解決策を投稿する(?!)

@echo off 
    setlocal enableextensions enabledelayedexpansion 

    rem Our search limit 
    set "limit=20" 
    rem Note: batch arithmetic is limited to 2^31 values, so 26 is the highest 
    rem  value that we can directly use 

    rem Initialize searched number 
    set "euler5=1" 

    rem Initialize list of numbers for a Erastotenes cribe 
    for /l %%a in (2 1 %limit%) do set "f.%%a=%%a" 

    rem Search for prime numbers and simplify (divide) greater multiples 
    rem Keep multiplying as we iterate over the list 
    for /l %%a in (2 1 %limit%) do (
     if !f.%%a! gtr 1 (
      set /a "euler5*=!f.%%a!" 
      for %%c in (!f.%%a!) do for /l %%b in (%%a %%a %limit%) do (
       set /a "f.%%b/=%%c" 
      ) 
     ) 
    ) 

    rem Echo solution 
    echo %euler5% 
0

に従ってlinkモジュラス演算子があります。

だから、これはあなたのスクリプトを修正しませんが、それは間違いなく速い方法です

@echo off 

::we should start with 21 because we know that all numbers from 1-20 
::cannot be divided by 20 all 20 times. 
::This will also fix the problem of an unwanted a zero remainder at the 
::early numbers 

set count=21 
set divide=1 
::We need to set enabledelayedexpansion so we can use ! as a varible 
::expander. 
setlocal enabledelayedexpansion 

:loop 
:: begin the modulus operator. 
set /a remainder=!count!%%!divide! 
if %remainder%==0 (
if %divide%==20 
::Yea! 
echo number found:%count% 
::Don't forget to pause 
::or else you cant see the number. 
pause 
) else (
set /a divide=%divide%+1 
::equivelent to set /a divide+=1 
goto :loop 
) 
) else (
set /a count=%count%+1 
goto :loop 
) 

代わりにこれを試すことができます。

関連する問題