如何对整数的各个数字求和?
我有一个整数值(例如:723),我想将这个整数中的所有值相加,直到得到一个值。
ex: 7 + 2 + 3 = 12 1 + 2 = 3
我是C#的新手。 请给我一个很好的解释你的答案:)
int i = 723; int acc; do { acc = 0; while (i > 0) { acc += i % 10; i /= 10; } i = acc; } while(acc>=10);
% 10
每次都给出最后的数字,所以我们将它添加到累加器中。 /= 10
执行整数除法,基本上每次删除最后一位数。 然后我们重复,直到我们有足够小的数字。
虽然你拿出底部数字并除以10的解决方案是正确的并且清楚地实现了所需的function,但如果你知道一个技巧,你可以用更少的代码完成这项任务。 如果您按照描述对数字求和,直到得到一位数字, 则得到的结果是将原始数字除以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
它被称为“抛出九”,因为你可以忽略总和中的任何九,因为它们没有任何区别:
9123 --> 9 + 1 + 2 + 3 = 15 --> 1 + 5 = 6
,这与1 + 2 + 3
。 你可以“抛弃”这九个并仍然得到相同的结果。
现在,你可以certificate数字的总和是除以9时的余数吗? 你能certificate投出九分为总和吗? 您是否可以推断并certificate检查错误产品的类似规则?
下面的掠夺者
让我们定义一个关系x≡c,这意味着“x和c是非负整数,并且存在非负整数n,使得x = 9n + c”。 也就是说,x和c是“全等的模九”。 得到它了?
首先要certificate:如果x≡c和y≡d则x +y≡c+ d。
这很简单。 根据该关系的定义,存在非负整数m和n,使得x = 9n + c且y = 9m + d。 我们必须certificate存在非负整数p,使得x + y = 9p + c + d。 整数p显然是m + n。 由于存在这样的整数,因此该关系成立。
第二件事要certificate:如果x≡c和y≡d那么xy≡cd。
同样,我们必须certificate存在一个整数p,使得xy = 9p + cd。 通过第一定理的类似certificate,p = 9nm + mc + nd起作用,因此该关系成立。
第三件事要certificate:对于任何非负整数n,10n≡1。
通过归纳certificate很容易:
- 显然100≡1
- 显然101≡1
- 做出归纳假设:假设10k≡1,其中k> 0。
- 10 k + 1 = 10 1 10 k
- 10 1 10k≡(1)(1)由我们的第二个certificate。
- 因此,如果10k≡1则10 k + 1≡1
- 因此,对于所有非负整数n,通过感应10n≡1。
从这三个定理你现在可以看到
a(10 2 )+ b(10 1 )+ c(10 0 )≡a+ b + c
所以我们已经certificate了十进制表示法中的数字是“全等数量9”到它的数字之和。
现在,我们的第一个certificate就是“驱逐9”作为算术校验和的事实。
递归使用Mod(%):
int AddUp(int number){ if(number<10) return number; return AddUp(number/10) + number % 10; }
嗯,一个快速的function浮现在我的脑海里
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();
int a=723; if(a % 9 ==0){ result = 9; } else if(a % 9 !=0){ result = a % 9; }