gpt4 book ai didi

c - N 个数的二次和 : implementation in C

转载 作者:太空宇宙 更新时间:2023-11-04 05:35:23 24 4
gpt4 key购买 nike

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

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

  • 二次高斯和(函数:quadratGauss(int n))
  • 迭代(函数: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 运算符。我最初想使用移位运算符“<<”,但我也尝试了其他运算符。当我尝试 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;
}

最佳答案

这仅适用于 n = 0。请放心,您不能仅使用 XOR 运算符来实现平方,即使对于整型也是如此。

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

关于c - N 个数的二次和 : implementation in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40026915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com