C# 将奇数和偶数分别相加的最短方法是什么

C# 将奇数和偶数分别相加的最短方法是什么,c#,math,for-loop,C#,Math,For Loop,我一直喜欢使用简单但聪明的数学方法来减少代码行的数量。这种情况似乎是需要这种方法的情况之一。所以我基本上需要的是用最小的代码分别对奇数和偶数的数字求和。到目前为止,这是我能想到的最好的方法: string number = "123456789"; int sumOfDigitsInOddPlaces=0; int sumOfDigitsInEvenPlaces=0; for (int i=0;i<number.length;i++){ if(i%2==0)//Means odd o

我一直喜欢使用简单但聪明的数学方法来减少代码行的数量。这种情况似乎是需要这种方法的情况之一。所以我基本上需要的是用最小的代码分别对奇数和偶数的数字求和。到目前为止,这是我能想到的最好的方法:

string number = "123456789";
int sumOfDigitsInOddPlaces=0;
int sumOfDigitsInEvenPlaces=0;
for (int i=0;i<number.length;i++){
   if(i%2==0)//Means odd ones
     sumOfDigitsInOddPlaces+=number[i];
   else
     sumOfDigitsInEvenPlaces+=number[i];    
{
//The rest is not important

你有更好的主意吗?不需要使用if-else的东西

您可以使用两个单独的循环,一个用于奇数索引数字,另一个用于偶数索引数字。 此外,您的模条件可能是错误的,您正在放置偶数索引数字0,2,4。。。在奇数累加器中。可能是因为你正在考虑数字为1的索引,而数字数组是基于0的,也许是你想要的,但是为了算法的缘故,我会考虑数字是0的。 这是我的建议

number = 123456789;
sumOfDigitsInOddPlaces=0;
sumOfDigitsInEvenPlaces=0;

//even digits
for (int i = 0; i < number.length; i = i + 2){
    sumOfDigitsInEvenPlaces += number[i];
}

//odd digits, note the start at j = 1
for (int j = 1; i < number.length; i = i + 2){
    sumOfDigitsInOddPlaces += number[j];    
}
在很大程度上,这并没有提高效率,仍然是一种On算法,但它消除了分支

您喜欢Python吗

int* sum[2] = {&sumOfDigitsInOddPlaces,&sumOfDigitsInEvenPlaces};

for (int i=0;i<number.length;i++)
{
    *(sum[i&1])+=number[i];
}
num_string = "123456789"

odds  = sum(map(int, num_string[::2]))
evens = sum(map(int, num_string[1::2]))

此Java解决方案不需要if/else,没有代码重复,并且处于启用状态:

number = "123456789";
int[] sums = new int[2]; //sums[0] == sum of even digits, sums[1] == sum of odd

for(int arrayIndex=0; arrayIndex < 2; ++arrayIndex) 
{
    for (int i=0; i < number.length()-arrayIndex; i += 2)
    {
       sums[arrayIndex] += Character.getNumericValue(number.charAt(i+arrayIndex));
    } 
}
由于您在问题中添加了C:

        var numString = "123456789";

        var odds = numString.Split().Where((v, i) => i % 2 == 1);
        var evens = numString.Split().Where((v, i) => i % 2 == 0);

        var sumOfOdds = odds.Select(int.Parse).Sum();
        var sumOfEvens = evens.Select(int.Parse).Sum();

假设number.length为偶数,则非常简单。然后,角的情况是考虑最后一个元素,如果数字是不均匀的。< /P>
int i=0;
while(i<number.length-1)
{
    sumOfDigitsInEvenPlaces += number[ i++ ];
    sumOfDigitsInOddPlaces += number[ i++ ];
}

if( i < number.length )
    sumOfDigitsInEvenPlaces += number[ i ];
因为循环经过I2乘2,如果number.length为偶数,则删除1不会产生任何效果。 如果number.length不均匀,则删除最后一项。 如果number.length不均匀,则退出循环时i的最后一个值是尚未访问的最后一个元素的值。 如果number.length不均匀,则通过模2推理,必须将最后一项添加到SumofDigitizinEvenplaces。 对我来说,这似乎比Anonymous接受的答案更冗长,但也更具可读性。然而,未来的基准仍将存在

嗯,编译器似乎也认为我的代码更容易理解,因为如果我不打印结果,他会删除所有代码,这解释了为什么我一直得到0的时间。。。。然而,另一段代码甚至对编译器来说也已经足够模糊了

最后,即使使用巨大的阵列,时钟也很难分辨两者之间的区别。在第二种情况下,指令数减少了约三分之一,但由于所有内容都在缓存中,即使在寄存器中,运行的总和也不重要


出于好奇,我将从C编译的两个版本的反汇编放在这里:

What system,binary,dec,hex?如何从数字中访问第i个数字?数组?我已经编辑了代码,请看一下。如果你做一个sumOfDigits[2]数组,你可以只做sumOfDigits[I%2]+=number[I];而不是用两个单独的变量来计算奇数和偶数。这是用来检查11的整除性吗?然后你可以添加奇数,删除偶数或相反的词。当然,我喜欢,这是我最喜欢的词之一。虽然这是正确的,但我希望不必把它与特定的语言联系在一起。我在寻找任何能在循环中使用的语言。这看起来像C++。如果我缺少什么,请纠正我。你把数字加在哪里?From*sum[i&1]+=数[i];我可以理解,你把所有的数字加在数组的第一个元素上。i和1相当于在C和C++中以及JS和许多其他语言中的I 2。非常感谢。这似乎是最好、最短、最普遍的方法。回答得好。也许可以添加一个简短的解释/链接,说明为什么删除分支是有用的/重要的。在外部for循环中使用0/1并不是Java所独有的。@Teepeemm我没有说过这个解决方案是Java所独有的-事实上,我故意使它适用于尽可能多的语言。然而,代码是Java,而不是伪代码,这可能对未来的读者有所帮助。在最初的问题写完后,提问者将他们的标签改为包含C。