如何对整数的各个数字求和?

时间:2011-03-01 06:27:37

标签: c# arrays

我有一个整数值(例如:723),我想将这个整数中的所有值相加,直到我得到一个值。

ex: 7 + 2 + 3 = 12
    1 + 2     = 3

我是C#的新手。请给我一个很好的解释你的答案:)

5 个答案:

答案 0 :(得分:40)

虽然你拿出底部数字并除以10的解决方案是正确的并且清楚地实现了所需的功能,但如果你知道一个技巧,你可以在 far 少代码中执行此任务。如果您按照描述对数字求和,直到得到一位数字,得到的结果是将原始数字除以9

时的余数。

试试吧。 789 --> 7 + 8 + 9 = 24 --> 2 + 4 --> 6, and 789 = 87 * 9 + 6

如果x是正整数,那么只需执行x % 9就可以解决问题。如果你得到零,那么实际结果是九,否则你得到重复的数字总和。

这个技巧导致了一种检查称为“抛出9”的算术的方法。假设您有一笔金额,并且您想要检查它是否正确:

  3147 
+ 5926
  ----
  9063  

这是对的吗?在每一行上做你的伎俩:

  3147 --> 3 + 1 + 4 + 7 = 15 --> 1 + 5 = 6
+ 5926 --> 5 + 9 + 2 + 6 = 22 --> 2 + 2 = 4
  ----
  9063 --> 9 + 0 + 6 + 3 = 18 --> 1 + 8 = 9

现在就总结一下。 6 + 4 = 10 --> 1 + 0 = 1如果你做了原始数学,那么两个校验和应该是相等的,但它们不是,第一个是1,第二个是9.当然,在十位有一个错误。正确的总和是

  3147 --> 3 + 1 + 4 + 7 = 15 --> 1 + 5 = 6
+ 5926 --> 5 + 9 + 2 + 6 = 22 --> 2 + 2 = 4
  ----
  9073 --> 9 + 0 + 7 + 3 = 19 --> 1 + 9 = 10 --> 1 + 0 = 1

现在校验和是一样的。 6 + 4 = 10 --> 1 + 0 = 1

它被称为“抛出9”,因为你可以忽略总和中的任何9,因为它们没有任何区别:

9123 --> 9 + 1 + 2 + 3 = 15 --> 1 + 5 = 6,与1 + 2 + 3相同。你可以“抛弃”这九个,但仍然得到相同的结果。

现在,你可以证明数字的总和是除以9时的余数吗?你能证明投出九分为总和吗?您是否可以推断并证明用于检查产品的错误的类似规则?

下面的SPOILERS

设定关系x≡c,这意味着“x和c是非负整数,并且存在非负整数n,使得x = 9n + c”。也就是说,x和c是“一致的模九”。知道了吗?

要证明的第一件事:如果x≡c和y≡d则x +y≡c+ d。

这很简单。根据该关系的定义,存在非负整数m和n,使得x = 9n + c和y = 9m + d。我们必须证明存在非负整数p,使得x + y = 9p + c + d。整数p显然是m + n。由于存在这样的整数,因此该关系成立。

要证明的第二件事:如果x≡c和y≡d则xy≡cd。

同样,我们必须证明存在一个整数p,使得xy = 9p + cd。通过第一个定理的类似证明,p = 9nm + mc + nd起作用,因此该关系成立。

要证明的第三件事:对于任何非负整数n,10 n ≡1。

通过归纳证明很容易:

  • 显然10 0 ≡1
  • 显然10 1 ≡1
  • 做出归纳假设:假设10 k ≡1其中k> 0.
  • 10 K + 1 = 10 1 10 ķ
  • 10 1 10 k ≡(1)(1)通过我们的第二个证明。
  • 因此,如果10 k ≡1则10 k + 1 ≡1
  • 因此,通过归纳10 n ≡1对于所有非负整数n。

从这三个定理你现在可以看到

a(10 2 )+ b(10 1 )+ c(10 0 )≡a+ b + c

所以我们已经证明,十进制表示法中的数字是“全等数值9”到其数字的总和。

现在,我们的第一个证据就是“铸出9”作为算术校验和的事实。

答案 1 :(得分:16)

int i = 723;
int acc;
do {
    acc = 0;
    while (i > 0)
    {
        acc += i % 10;
        i /= 10;
    }
    i = acc;
} while(acc>=10);

% 10每次都给出最后的数字,所以我们将它添加到累加器中。 /= 10执行整数除法,基本上每次删除最后一位数。然后我们重复,直到我们有足够小的数字。

答案 2 :(得分:12)

递归使用Mod(%):

int AddUp(int number){
    if(number<10) return number;
    return AddUp(number/10) + number % 10;
}

答案 3 :(得分:4)

嗯,我想到的一个快速功能是

int number = 723;
double sum = number.ToString().Sum(s => Char.GetNumericValue(s));
string numString = number.ToString();

用于计算LINQ使用的所有总和

double [] allSums = Enumerable.Range(1, numString.Length).Select(i =>numString.Substring(0, i).Sum(s => Char.GetNumericValue(s))).ToArray();

答案 4 :(得分:0)

int a=723;

if(a % 9 ==0){
   result = 9;
}
else if(a % 9 !=0){
   result = a % 9;
}