C++程序题 给定正整数n,求(1/2)*(2/2)*(3/2)*…*(n/2)。

  1. 给定正整数n,求(1/2)*(2/2)*(3/2)*…*(n/2)。(注:本题已提供一部分起始代码,请根据题意补充完整即可;无需任何输出结果。)

int n = 100; // 给定的正整数

int result; // 最终结果写入该变量

(需要补充)

#include <stdio.h>
int main(){
	int n = 100;
	float result = 1;
	for (int i = 1; i < n; i++){
		result *= ((float)i / 2);
	}
	printf("%lf", result);
}

int result是不对的。因为结果是浮点数.当int作为被除数时,如1/2 得到的结果是0

#include <stdio.h>
int main(){
	int n = 100;
	int result = 1;
	for (int i = 1; i < n; i++){
		result *= (i / 2);
	}
	printf("%lf", result);
}

 

楼上两个都不考虑下n=100的情况。。

#include <stdio.h>
int main(){
	int n = 100;
	float result = 1;//这里需要使用float,不然结果是错的,到后面的时候如果需要再转成int
	for (int i = 1; i <= n; i++){
		result *= (i / 2.0); //这里要除以2.0,结果才是float,不然1/2会等于0而不是0.5
	}
	printf("%lf", result);
    //
    int res=(int)float;//这里转成整数
}

 

include <stido.h>

float calc(int n){

    float result = 1;

    if(n <=0){

        printf("n must be large than 0!\n");

        return -1;
    }

    for(int i = 0; i < n; i++){

        result *= (float)i/2;

    }

    return result;

}

int main(){

    int n = 100;

    float result = 0;

    result = calc(n);

    if(result < 0){

        printf("the result error!\n");

    }else{

        printf("the result is %f\n", result);

    }

}

注意:

1.代码中的打印要尽可能的清晰不要听打印结果一个数字。

2.尽可能的把一个功能写成一个函数,这样才能重复调用。

3.代码要对非法的结果做出保护,如n <=0的情况要返回错误。

如果对你有帮助欢迎关注我的博客,我会持续发布技术文档。

#include <stdio.h>
int main(){
	int n = 100;
	int result;
    float res = function(n)
	
    int res=(int)res;//这里转成整数
}
// 迭代法计算n/2的乘积
float function(int n){
    if(n < 1){
        return 0.0;
    }
    return (n/2.0)*function(n-1);
}

 

每次运算都除2会导致很大的精度丢失,实际的值是算n!/2^n,即n的阶乘除2的n次幂。13!=6,227,020,800,都已经超int范围了。不过在想想,肯定不是要算这么高难度的问题了。正常解题一个for循环就可以了