2016-08-02 4 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 है, और अगर यह होता है, iter मूल्य में 1 जोड़ देते, जब तक यह 21. हालांकि तक पहुँच जाता है कि क्या करना चाहिए है; यदि यह 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. विचार यह क्यों करता है? ' सेट init = 1 सेट आईटीईआर = 1 सेट/बंद @ECHO एक समारोह ="% init% %%% आईटीईआर% " cls : Num यदि"% समारोह% "==" 0 "( \t यदि"% आईटीईआर% "==" 21 "( \t \t गूंज। \t \t ECHO वैल =% init% \t \t गूंज। \t \t प्रेस से बाहर निकलने के लिए कोई कुंजी गूंज।।। \t \t पी ause> nul \t \t बाहर निकलने \t) और ( \t \t गूंज% init% आधुनिक% आईटीईआर% = 0; CONT \t \t सेट/एक आईटीईआर + = 1 \t \t गोटो अंक \t) ) और ( गूंज% init% आधुनिक% आईटीईआर%!= 0; BREAK \t सेट आईटीईआर = 1 \t सेट/एक init + = 1 \t गोटो अंक ) ' बदसूरत प्रारूपण के लिए क्षमा करें। – 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 
) 

कोशिश कर सकते हैं हालांकि यह अपनी स्क्रिप्ट को ठीक नहीं है, यह निश्चित रूप से एक तेज़ तरीका है।

संबंधित मुद्दे