C# 如何对整数的各个数字求和?
我有一个整数值(例如:723),我想把这个整数值中的所有值相加,直到得到一个值C# 如何对整数的各个数字求和?,c#,arrays,C#,Arrays,我有一个整数值(例如:723),我想把这个整数值中的所有值相加,直到得到一个值 ex: 7 + 2 + 3 = 12 1 + 2 = 3 我是C#的新手。请给我一个很好的解释你的答案:) %10每次给出最后一位数字,因此我们将其添加到累加器中/=10执行整数除法,每次基本上都删除最后一位。然后我们重复,直到我们有一个足够小的数字。嗯,我想到的一个快速函数是 int number = 723; double sum = number.ToString().Sum(s =>
ex: 7 + 2 + 3 = 12
1 + 2 = 3
我是C#的新手。请给我一个很好的解释你的答案:)
%10
每次给出最后一位数字,因此我们将其添加到累加器中/=10
执行整数除法,每次基本上都删除最后一位。然后我们重复,直到我们有一个足够小的数字。嗯,我想到的一个快速函数是
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();
递归使用Mod(%):
int AddUp(int number){
if(number<10) return number;
return AddUp(number/10) + number % 10;
}
int AddUp(整数){
如果(数字虽然从底部拉出数字并除以10的解决方案是正确的,并且清楚地实现了所需的功能,但是如果你知道一个技巧,你可以用更少的代码来完成这项任务。如果你按照你所描述的方法将数字相加,直到得到一个单位数,当你除以原始数字时,你得到的结果就是余数按九进行编号
试试看。789-->7+8+9=24-->2+4-->6和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时,数字的和就是余数吗?你能证明舍弃9对和有效吗?你能推导并证明一个类似的规则来检查产品的错误吗
下面的扰流板
让我们定义一个关系x≡这意味着“x和c是非负整数,存在一个非负整数n,使得x=9n+c”。也就是说,x和c是“模九全等的”。明白了吗
首先要证明的是:如果x≡c和y≡然后是x+y≡c+d
这很简单。根据关系的定义,存在非负整数m和n,x=9n+c,y=9m+d。我们必须证明存在一个非负整数p,x+y=9p+c+d。整数p显然是m+n。因为存在这样一个整数,关系成立
第二件要证明的事情:如果x≡c和y≡然后是xy≡光盘
同样,我们必须证明存在一个整数p,使得xy=9p+cd。通过对第一定理的类似证明,p=9nm+mc+nd起作用,所以关系成立
要证明的第三件事:10n≡1表示任何非负整数n
归纳法很容易证明:
- 显然是100≡一,
- 显然是101≡一,
- 做出归纳假设:假设10k≡1,其中k>0
- 10k+1=10110k
- 10110k≡(1) (1)通过我们的第二次证明
- 因此,如果10k≡1然后是10k+1≡一,
- 因此通过感应10n≡1表示所有非负整数n
从这三个定理可以看出
a(102)+b(101)+c(100)≡ a+b+c
我们已经证明了十进制记数法中的一个数字与它的数字之和是“模九全等的”
“排除9”作为算术校验和工作的事实现在从我们的第一个证明立即开始。我得到的答案(i)是0…我如何显示最终答案?@megazoid你刷新了吗?acc
和i
都应该以3int i=723;int acc;do{acc=0;while(i>0)结尾{acc+=i%10;i/=10;}i=acc;}而(acc>=10);int val=i;这行吗???@megazoid-是的;你得到了什么?我得到了3。@Marc,div+sub+mul应该比div+mod+1快。他需要一个while循环,当它只有一个数字/当总和与输入相同时终止,以便执行他正在寻找的数字算法。但这是个好主意:)由于不必要的ToString()
s和Convert
s,效率低下。即使它看起来很简单,我也不会使用它。也许更好的标题是“如何将整数拆分为数字”让rem(x,y)
是x
除以y
的整数除法的余数。我们想证明rem(n,9)+rem(m,9)=rem(n+m,9)
对于所有整数n
和m
。我们知道rem(x,y)=x-y*floor(x/y)
。使用这个我们得到n-9*floor(n/9)+m-9*floor(m/9)=n+m-9*floor((n+m)/9)
。从两边减去n+m
,然后乘以-1/9,我们剩下floor(n/9)+m+m=floor(n/9)
。使用floor函数的一些属性,我们知道floor(n/9+m/9)=floor(n/9)+floor(m/9)
或floor(n/9+m/9)=floor(n/9)+floor(m/9)+1
。现在怎么办?我差一点就到了……但我的底子不及格。我必须重新阅读TAOCP的第一部分。@Martinho:我觉得用十进制加法来证明这一点更简单。例如,5+9:一位减少1,十位增加1。十位可能会减少9,而百位则会减少增加1(等)。@Martinho:rem(n,9)+rem(m,9)=rem(n+m,9)
不是真的。尝试n=m=5。正确的是rem(rem(n,9)+rem(m,9)=rem(n+m,9)
int a=723;
if(a % 9 ==0){
result = 9;
}
else if(a % 9 !=0){
result = a % 9;
}
int a=723;
if(a % 9 ==0){
result = 9;
}
else if(a % 9 !=0){
result = a % 9;
}