1 题目
编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。
2 分析
首先判断n
的奇偶性,通过if
控制语句对2
取余来判断,再根据n
的奇偶性调用不同的计算方法,这里把两个计算方法写成两个函数,不难发现累加的规律为当n
为偶数时,所有累加项都是以1
为分子,分母是从2
开始的偶数序列;当n
为奇数时,所有累加项分子也是1
,分母则是从1
开始的奇数序列。
注:本题使用函数指针来实现。
3 实现
#include <stdio.h>
#include <stdlib.h>
double evenumber(int n);
double oddnumber(int n);
int main()
{
int n;
double sum;
double (*pfunc)(int); // 定义函数指针
printf("请输入n:");
scanf("%d", &n);
if (n % 2 == 0) { // 判断奇偶
pfunc = evenumber; // 偶数函数
} else {
pfunc = oddnumber; // 奇数函数
}
sum = (*pfunc)(n); // 通过指针调用函数
printf("%lf\n", sum);
return 0;
}
// 当n为偶数时
double evenumber(int n)
{
double s = 0; // 累加和
double a = 0; // 保存每一项的临时变量
for (int i = 2; i <= n; i += 2) {
a = (double)1/i; // 该除法会出现小数,所以要强制转换
s += a; // 累加
}
return s;
}
// 当n为奇数时
double oddnumber(int n)
{
double s = 0; // 累加和
double a = 0; // 保存每一项的临时变量
for (int i = 1; i <= n; i += 2) {
a = (double)1/i; // 该除法会出现小数,所以要强制转换
s += a; // 累加
}
return s;
}
4 运行结果
PS E:\C++WorkSpace> cd "e:\C++WorkSpace\" ; if ($?) { g++ FFF.cpp -o FFF } ; if ($?) { .\FFF }
请输入n:10
1.141667
PS E:\C++WorkSpace> cd "e:\C++WorkSpace\" ; if ($?) { g++ FFF.cpp -o FFF } ; if ($?) { .\FFF }
请输入n:51
2.610834