我正在寻找一个数字求和的算法。让我概述一下基本原理:
假设你有一个数字:18268
。
1 + 8 + 2 + 6 + 8 = 25
2 + 5 = 7
7是我们的最终数字。它基本上是将整个数字的每个数字相加,直到我们得到一个单独的(也称为“核心”)数字。这经常被数理算命师使用。
我正在寻找一个算法(不必考虑特定语言),用于实现这一过程。我已经用诸如“数字总和算法”之类的术语在谷歌上搜索了一个小时,但没有找到合适的结果。
我正在寻找一个数字求和的算法。让我概述一下基本原理:
假设你有一个数字:18268
。
1 + 8 + 2 + 6 + 8 = 25
2 + 5 = 7
7是我们的最终数字。它基本上是将整个数字的每个数字相加,直到我们得到一个单独的(也称为“核心”)数字。这经常被数理算命师使用。
我正在寻找一个算法(不必考虑特定语言),用于实现这一过程。我已经用诸如“数字总和算法”之类的术语在谷歌上搜索了一个小时,但没有找到合适的结果。
因为10-1=9,一些小的数论知识可以告诉你最终答案就是n mod 9。以下是代码:
ans = n%9;
if(ans==0 && n>0) ans=9;
return ans;
例子:18268%9 是7。(还可参考: Casting out nines。)
int number = 18268;
int core = number;
int total = 0;
while(core > 10)
{
total = 0;
number = core;
while(number > 0)
{
total += number % 10;
number /= 10;
}
core = total;
}
不支持负数,但我也不知道你会如何处理。你还可以将f(x)
更改为迭代形式:
sum( x ) =
while ( ( x = f( x ) ) >= 10 );
return x;
f( x ) =
if ( x >= 10 ) return f( x / 10 ) + x % 10
return x
f(x)
函数:f( x ) =
if ( x == 0 ) return 0
return x % 9
private static int sum(long number) {
int sum = 0;
if (number == 0) {
return 0;
}
do {
int last = (int) (number % 10);
sum = (sum + last) % 9;
} while ((number /= 10) > 0);
return sum == 0 ? 9 : sum;
}
这是很久以前的事情了,但我对此最好的解决方案是:
int digitSum(int num){
if (num < 10) return num;
else return (n-1)%9+1;
}
我不知道这个算法有多好,但它可以轻松处理可被9整除的数字。真是一个很酷的算法。
int number = 18268;
int total = 0;
while(number > 0)
{
total += number % 10;
total = total%10;
number /= 10;
}
public int DigitSum(long n)
{
return (int)(1 + (n - 1) % 9);
}