我有數字序列:0、1、1、2、3、5、8、13、12、7、10 ......然后每個數字都是前面元素的單獨數字的總和。有點像斐波那契..我想寫一個函式
int FindSimilarFibo(int x)
{
//x = 10 return 10
//x = 6 return 8
}
我寫了這個,但我不知道正確的演算法:
int FindSimilarFibo(int x) {
int p = 0;
int q = 1;
for (int i = 0; i < n; i )
{
int temp = p;
p = q;
q = temp q;
if (q > 9)
{
int leftQ = q % 10;
int rightQ = q / 10;
q = leftQ rightQ;
q = temp q;
}
if (p > 9)
{
int leftQ = q % 10;
int rightQ = q / 10;
temp = leftQ rightQ;
p = q;
q = temp q;
}
}
return p;
}
uj5u.com熱心網友回復:
問題似乎是您在計算下一個數字總和時覆寫了以前的值;所以……不要那樣做?也許:
static int FindSimilarFibo(int n)
{
int p = 0;
int q = 1;
for (int i = 0; i < n; i )
{
var next = SumDigits(p) SumDigits(q);
p = q;
q = next;
}
return p;
static int SumDigits(int value)
{
int sum = 0;
while (value > 9)
{
sum = value % 10;
value /= 10;
}
return sum value;
}
}
uj5u.com熱心網友回復:
如果您在 The Online Encyclopedia of Integer Sequences 中搜索您的序列,您將在A010077找到它。
一種實作方式為
a(n) = floor(a(n-1)/10) floor(a(n-2)/10) (a(n-1) mod 10) (a(n-2) mod 10)
或者在c#中
public int A010077(int n)
{
int n_2 = 0;
int n_1 = 1;
int value = 0;
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
for (int i=0; i<n-1; i )
{
value = (n_1 / 10) (n_2 / 10) (n_1 % 10) (n_2 % 10);
n_2 = n_1;
n_1 = value;
}
return value;
}
例如
Enumerable.Range(1, 20).Select(A010077)
給
1, 1, 2, 3, 5, 8, 13, 12, 7, 10, 8, 9, 17, 17, 16, 15, 13, 10, 5, 6
uj5u.com熱心網友回復:
如果你列印出這個序列的所有值,你會看到:
0, 1, 1, 2, 3, 5, 8, 13, 12, 7, 10, 8, 9, 17, 17, 16, 15, 13, 10, 5, 6, 11, 8, 10, 9, 10, 10, 2, 3, 5, 8, 13, 12, 7, 10, 8, 9, 17, 17, 16, 15, 13, 10, 5, 6, 11, 8, 10, 9, 10, 10
檢查顯示該序列以 開頭2, 3, 5, 8和結尾重復10, 9, 10, 10。
鑒于此,我們可以撰寫一個像這樣的非回圈解決方案:
public static int FindSimilarFibo(int x)
{
if (x == 0)
return 0;
if (x <= 2)
return 1;
int[] values = { 2, 3, 5, 8, 13, 12, 7, 10, 8, 9, 17, 17, 16, 15, 13, 10, 5, 6, 11, 8, 10, 9, 10, 10 };
return values[(x values.Length - 3) % values.Length];
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514867.html
標籤:C#算法
下一篇:求N-單調數
