在javascript中制作一個查找素數的函式。我想讓它在找到一個質數時將數值顯示到textarea。
然而,它將只在函式完全執行時顯示結果。
下面是我的代碼。
。。
let start = performance.now()
let textarea = document.querySelector('textarea'/span>)
let time = document.getElementById('time')
let texts = document.getElementById('text')
let amount = document.getElementById('mount')
let status = document.getElementById('status')
let logs = [];
let number = 0.
let prime = [];
function check(){
status.textContent = 'processing'。
amount.textContent = 'processing'
time.textContent = 'processing'
textarea.textContent =logs
setTimeout(function(){reallycheckprimenumber()},0)
}
function reallycheckprimenumber(){
number = 0;
let start = performance.now()
let value = texts.value。
if(value ==''/span>){
value = texts.placeholder。
}
for (var i = 0; i<value;i ){
time.textContent = ' '
amount.textContent = ''
var nums = 2;
for (let x = 0; x<=i/2; x ){
if(nums>3){
break。
}
if(i!==0 && i!==1 && i !==x){
if(i%x === 0){
nums ;
}
}
}
if(nums === 3){ nums ; }
prime.push(i)
textarea.textContent = prime。
number =1。
}
if(i ==value-1) {
status.textContent = 'done'。
let end = performance.now()
time.textContent = (end-start).toFixed(5) 'ms)
amount.textContent = number
}
}
}
check()
。
<h1>獲取總理號碼的申請:</h1>
<h2>素數。<span>< /span></h2>/span>
<h3>/span>處理時間。<span id = 'time'/span>> 0 ms</span></h3>
<h3>號碼。<span id = '金額'> 0</span></h3>
<h3>/span>狀態。<span id = 'status'/span>> 處理</span></h3>
<label for = 'text'/span>> 輸入你想得到的數字范圍</label>。
< input type = 'text'/span> id = 'text' placeholder = '100'>
< input type = 'button' id = 'button' value = 'set' onclick = 'check()'>
<textarea readonly></textarea>
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
我已經嘗試了幾種方法,使應用程式在尋找其他素數時顯示素數。然而,我失敗了。
我發現只有console可以作業。
我真的不知道如何解決這個問題。
有誰知道如何解決這個問題? 非常感謝任何幫助和支持
。
uj5u.com熱心網友回復:
從2,3開始,你不需要每次都用===來檢查它們。檢查到數字的平方值就足夠了。下面的代碼段將在找到一個串列時將其列印到textArea中。
注意,使用 setTimeout 或任何型別的固定間隔更新似乎并不是一個好主意,因為質數會隨著時間的推移而變得稀疏,這意味著在螢屏上記錄一些東西的時間會越來越長。
。(function(start){
const list = start,
myarea = document.getElementById("myarea"/span>)。
let nCurrent = start[start.length - 1] 。
function recurse(){
let _sqrt = Math.sqrt(nCurrent)。
for (let i = 2; i <= _sqrt; i) {
if(! (nCurrent % i)){
break;
}
if (i === Math.floor(_sqrt)>){
list.push(nCurrent)。
myarea.textContent = list.toString()。
}
}
nCurrent ;
};
setInterval(recurse,500)。
}([2,3])
< textArea id="myarea"></textArea>
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
解釋一下。
- 最外面的功能是什么?
- 最外層函式是一個立即呼叫的函式運算式(
iife),它得到1個引數,一個串列開始。在這種情況下,我們從[2,3]開始,前兩個素數。 - 在內部我們創建了3個變數。
- 串列,它保存了到目前為止找到的所有質數 。
nCurrent,這是我們正在檢查是否為質數的當前數字 。
recurse,這是一個遞回函式,將由 setInterval 呼叫。
- 對于每一個
nCurrent,比方說120,我們只需要尋找到120的sqrt,看看數字<=sqrt(120)是否除以120。如果是的話,運算子%將回傳0,而!(nCurrent % i)將因此回傳真(!0為真)。在這種情況下,我們知道這不是一個質數,我們提前終止,增加nCurrent,并等到下次呼叫recurse。 - 如果所有的i直到
sqrt(nCurrent)被測驗,并且沒有除以它,那么我們有一個質數,我們將它推到串列中。 list.toString()是JS中陣列的默認字串化,它回傳所有由逗號連接的元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326640.html
標籤:
