对C#中以前的数字算法的位数求和



我有一系列数字: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;
}

问题似乎是在计算下一个的数字和时覆盖了以前的值;所以…不要那样做?也许:

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;
}
}

如果您在整数序列在线百科全书中搜索您的序列,您会在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

如果打印出该序列的所有值,您将看到:

0,1,1,2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,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];
}

最新更新