2016-07-28 66 views
1

如果您點擊這篇文章,我知道這個問題有點不清楚。所以我必須告訴你我的意思。如何創建一個複合數字變量等於指定值的公式?

var value = 30; 
var num = 1; 
var total = 0; 

while(num < 10){ 

total +=num; 
num++; 

} 
if(total == value){ 
console.log("They are equivalent"); 
} 

好吧考慮變量NUM,並託塔升。 num小於10時,爲指定值。我希望它將num值添加到總數中,但在循環結束時,我希望總數和值相等。我只是不知道該怎麼做,或者我需要創建什麼公式才能做到這一點。

+0

'1 + 2 + 3 + 4 + 5 + 6 + 7 = 28',和'1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36' ,那麼這是如何工作的? – FrankerZ

+0

我認爲你關注的是數字的價值,而不是我所說的,所以讓我用另一種方式來說。如何使num的值等於變量值,如果它已經循環了10次以上。無論值是30,50還是1000.我需要做什麼公式來使num值等於變量值,當它已被循環10次以上時 –

+0

我認爲如果您給我們幾個例子,這會有所幫助。給我們一個函數輸入,以及它應該輸出的內容。 – FrankerZ

回答

2

基本上你需要一個因素來增加你的價值。

如果剛添加計數器,它會從1到9,爲總和的表現公式是Triangular Number

sum = n * (n + 1)/2 

你知道的總和,你得到45,那就是多。對於正確的總和,你需要一個因子在加入之前乘以num。這只是

的劃分
wanted result/actual result = factor 
     30 /  45  = 2/3 = 0.6666666666666667 

這個因子可以在你的迭代中使用。

爲了準確性,我建議使用等效分數。

var value = 30, 
 
    num = 1, 
 
    total = 0; 
 

 
while (num < 10) { 
 
    total += num * 2/3; // apply factor 
 
    console.log(num, total); 
 
    num++; 
 
} 
 

 
if (total === value){ 
 
    console.log("They are equivalent"); 
 
}

-1

你的計算不會工作給你30,如果你正在尋找確切compouding方法等於值後,9次迭代,然後使用

var value =36; 

這是因爲

1+2+3+4+5+6+7+8 =36; 

這compund方法永遠不會給你30

+0

這在我的評論(上文)中已經提到,他澄清說這不是他想要的。 – FrankerZ

+0

當我回復我的手機應用程序沒有刷新我想, – yanguya995

0

你的循環正在計算算術級數的總和,也就是所謂的arithmetic series,從1開始, 1.在數學上的公差,進展是:

a1

d

an

並且總和爲:

Sn


像你想計算的ñnum在你的代碼)所需的值預先指定的值的總和小號ñvalue在你的代碼)這聽起來我。我們可以通過求解的上述總和方程來完成這個操作,即

我們可以通過重新排列如下開始:

Sn-rearrange-1

Sn-rearrange-2

這是一個quadratic equation。堵到quadratic formula

quad


下面是一個使用R上述結果的演示。

首先,只是爲了演示的求和公式:

calcTotal <- function(num) num*(num+1L)/2L; 
calcTotal(1:20); 
## [1] 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 

現在,這裏是我們如何能夠實現對ñ派生的解決方案。我寫了這個函數來產生一個矩陣,給出輸入S值在total列下,然後接下來的兩列顯示了對於±運算的正和負選擇的派生公式的結果值。

calcNum <- function(total) cbind(total,matrix(rep(each=2L,sqrt(2*total+0.25))*c(1,-1)-0.5,ncol=2L,byrow=T,dimnames=list(NULL,c('+','-')))); 
res <- calcNum(1:36); 
res; 
##  total  +   - 
## [1,]  1 1.000000 -2.000000 
## [2,]  2 1.561553 -2.561553 
## [3,]  3 2.000000 -3.000000 
## [4,]  4 2.372281 -3.372281 
## [5,]  5 2.701562 -3.701562 
## [6,]  6 3.000000 -4.000000 
## [7,]  7 3.274917 -4.274917 
## [8,]  8 3.531129 -4.531129 
## [9,]  9 3.772002 -4.772002 
## [10,] 10 4.000000 -5.000000 
## [11,] 11 4.216991 -5.216991 
## [12,] 12 4.424429 -5.424429 
## [13,] 13 4.623475 -5.623475 
## [14,] 14 4.815073 -5.815073 
## [15,] 15 5.000000 -6.000000 
## [16,] 16 5.178908 -6.178908 
## [17,] 17 5.352350 -6.352350 
## [18,] 18 5.520797 -6.520797 
## [19,] 19 5.684658 -6.684658 
## [20,] 20 5.844289 -6.844289 
## [21,] 21 6.000000 -7.000000 
## [22,] 22 6.152067 -7.152067 
## [23,] 23 6.300735 -7.300735 
## [24,] 24 6.446222 -7.446222 
## [25,] 25 6.588723 -7.588723 
## [26,] 26 6.728416 -7.728416 
## [27,] 27 6.865460 -7.865460 
## [28,] 28 7.000000 -8.000000 
## [29,] 29 7.132169 -8.132169 
## [30,] 30 7.262087 -8.262087 
## [31,] 31 7.389867 -8.389867 
## [32,] 32 7.515610 -8.515610 
## [33,] 33 7.639410 -8.639410 
## [34,] 34 7.761356 -8.761356 
## [35,] 35 7.881527 -8.881527 
## [36,] 36 8.000000 -9.000000 

首先,觀察減號的選擇總是導致負數。由於我們只對積極的結果感興趣,所以我們可以忽略該列。

其次,請注意加號的選擇總是會導致正數,但其中很多都是非整數。這是有道理的,因爲算術級數不落在所有可能的整數總和上。對於滿足進展整數基數的總數,該函數返回正確的積分結果。

我們可以子集出積分結果如下,使用自定義功能進行適當的浮點比較:

feq <- function(a,b,TOL=max(a,b)*1e-12) if (is.infinite(a) || is.infinite(b)) a==b else abs(a-b)<=TOL; 
res[feq(res[,'+'],round(res[,'+'])),]; 
##  total + - 
## [1,]  1 1 -2 
## [2,]  3 2 -3 
## [3,]  6 3 -4 
## [4,] 10 4 -5 
## [5,] 15 5 -6 
## [6,] 21 6 -7 
## [7,] 28 7 -8 
## [8,] 36 8 -9 

現在,您的代碼示例中有確切的總數:

calcNum(30); 
##  total  +   - 
## [1,] 30 7.262087 -8.262087 

這意味着我們需要7.262087次循環迭代才能達到總值30.這當然是不可能的。

相關問題