N个数的二次和:C

时间:2016-10-13 16:58:25

标签: c math

正如你可以在标题中看到的那样,它是一个相当简单的主题。但是在实现可能的不同方法来获得N个数的二次和时,我遇到了一些非常奇怪的事情。

我实施了三个不同的版本:

  • 二次高斯和(func:quadratGauss(int n))
  • Iterative(func:quadratIterativeClassic(int n))
  • 通过Bitoperation进行迭代(func:quadratIterativeBitoperation(int n))

所有三个函数都返回了与给定输入相同的结果。现在的大问题是。第三个功能怎么可能正常工作?守则如下:

void quadratGauss(int n){

    printf("+quadratGauss: \n");
    int result = ((n*(n+1))*(2*n+1))/2;
    printf("Result: %d\n----------------\n",result);

}

void quadratIterativClassic(int n){

    int result;
    printf("+quadratIterativClassic: \n");
    for(int i;i<=n;i++)
        result += i * i;
    printf("Result: %d\n----------------\n",result);

}

void quadratIterativeBitOperation(int n){

    int result;
    printf("+quadratIterativeBitOperation: \n");

    for(int i;i<=n;i++)
        result += i^2;

    printf("Result: %d\n----------------\n",result);

}

如您所见,我使用XOR运算符。我原本想使用shift-operator“&lt;&lt;”但我也试过别人。当我尝试XOR运算符时,令人惊叹的是:结果仍然与之前相同,与其他两个函数相同。我认为这是不可能的,因为 XOR不是电源操作的操作符,因为C不包含这样的操作符但是我最终得到了正确的结果。

我用不同数量的不同“尺寸”测试了这些功能。每个函数的结果都没有奇怪。

我不知道为什么。但必须有一个解释,不是吗? 如果你有一个,我会很感激写下一个可能的原因,为什么你可以用XOR运算符来实现它。

这里是整个主文件:

#include <stdlib.h>
#include <stdio.h>

#include <iostream>

#define N 5000



void sumGauss(int n)
{
printf("+sumGauss: \n");
int result = (n*(n+1)/2);
printf("Result: %d\n----------------\n",result);
}

void sumClassic(int n)
{
printf("+sumClassic: \n");
int result = 0;
for(int i = 0; i <= n; i++)
    result += i;
printf("Result: %d\n----------------\n",result);
}

void quadratGauss(int n){

printf("+quadratGauss: \n");
int result = ((n*(n+1))*(2*n+1))/2;
printf("Result: %d\n----------------\n",result);

}

void quadratIterativeBitOperation(int n){

int result;
printf("+quadratIterativeBitOperation: \n");
for(int i;i<=n;i++)
    result += i^2;
printf("Result: %d\n----------------\n",result);

}

void quadratIterativClassic(int n){

int result;
printf("+quadratIterativClassic: \n");
for(int i;i<=n;i++)
    result += i * i;
printf("Result: %d\n----------------\n",result);

}

void unevenSum(int n)
{
printf("+unevenSum: \n");
int uneven = 0;
int i=0;
for(i=1;i<= n;i+=2) {
    uneven += i;
}

printf("Result: %d\n----------------\n",uneven*2);


}

void unevenSumModulo(int n)
{
printf("+unevenSumModulo: \n");
int result=0;
for(int i=0;i<=n;i++)
{
    if( (i%1) == 0)
        result += i;
}

printf("Result: %d\n----------------\n",result);


}

void unevenSumNico(int n)
{
printf("+unevenSumNico: \n");
int odd = 0;
int i=0;
for(i=1;i<= n;i++) {
    odd += ((2*i)-1)/2;
}

printf("Result: %d\n----------------\n",odd);


}

void evenSum(int n)
{
printf("+evenSum: \n");
int result=0;
for(int i=0;i<=n;i++)
{
    if( (i%2) == 0)
        result += i;
}

printf("Result: %d\n----------------\n",result);


}

void Zins(float Kapital,int years)
{
printf("Zinstabelle fuer Grundkaptial %.2f Euro\n",Kapital);
printf("Kapitalstand zum Jahresende\n");
int i=0;
float K = Kapital;
for(int i =1;i<years+1;i++)
{

    K = K *(1.f + 0.05f);
    printf("Jahr: %2d         Kapital: %.2f Euro\n",i,K);

}
}

int main(int argc, char** argv) {

sumGauss(N);
sumClassic(N);

quadratGauss(N);
quadratIterativeBitOperation(N);
quadratIterativClassic(N);

unevenSum(N);
unevenSumNico(N);
unevenSumModulo(N);

evenSum(N);
Zins(N);


return 0;
}

3 个答案:

答案 0 :(得分:5)

这只适用于n = 0。请放心,即使对于整数类型,也不能仅使用XOR运算符实现平方。

您的代码的行为目前未定义,因为您没有初始化iresult。我怀疑你的循环根本没有运行,并且最惊人的巧合result在后​​续函数中占用与Guassian函数相同的内存。但是,不要依赖这种行为。其他编译器可能只是试图吃你的猫。

答案 1 :(得分:1)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
   int main(int argc, char const *argv[]){
    int i=0,n1;
     scanf("%d",&n1);

void quadratGauss(int n){
 printf("+quadratGauss: \n");
  int result = ((n*(n+1))*(2*n+1))/6;   // you made here mistake take 2 insted of 6.
  printf("Result: %d\n----------------\n",result);
 }

void quadratIterativClassic(int n){

  int result=0;
   printf("+quadratIterativClassic: \n");
     for(i=1;i<=n;i++)
       result += i * i;
  printf("Result: %d\n----------------\n",result);
 }

void quadratIterativeBitOperation(int n){
   int result=0;
   printf("+quadratIterativeBitOperation: \n");
    for(i=1;i<=n;i++)

    result += pow(i,2);  //This is power fun to add series of quadrat

    printf("Result: %d\n----------------\n",result);

  }
   //call the fun.
  quadratGauss(n1);
  quadratIterativClassic(n1);
  quadratIterativeBitOperation(n1);

  return 0; 
 }

:)想更多关于http://www.trans4mind.com/personal_development/mathematics/series/sumNaturalSquares.htm https://en.wikipedia.org/wiki/Quadratic_Gauss_sum

答案 2 :(得分:0)

首先,它是/ 6,而不是/ 2。看看quadratGauss总是quadratIterativClassic的3倍。而对于quadratIterativeBitOperation

,我得到了完全不同的结果
n = 4
+quadratGauss: 
Result: 90
----------------
+quadratIterativClassic: 
Result: 30
----------------
+quadratIterativeBitOperation: 
Result: 12
----------------
n = 5
+quadratGauss: 
Result: 165
----------------
+quadratIterativClassic: 
Result: 55
----------------
+quadratIterativeBitOperation: 
Result: 19
----------------
n = 6
+quadratGauss: 
Result: 273
----------------
+quadratIterativClassic: 
Result: 91
----------------
+quadratIterativeBitOperation: 
Result: 23

我认为你的编译器必须将^设置为exponent而不是XOR