前言
在刷题过程中遇到正负数交替问题,想了好久也没想明白,查阅了好多资料,发现有好几种方法,写这篇文章总结一下。
解决办法 主要是利用奇偶性,以及与-1的关系。
例题
题目
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
输入样例:
5
输出样例:
0.917
方法一
利用分子奇偶性,加减实现
#include<stdio.h>
int main()
{
int n;
int son=1,mom=1;
double sum=0;
scanf("%d",&n);
while(son<=n){
if(son%2==0){ //判断奇偶数
sum-=1.0*son/mom; //偶数减法
}else{
sum+=1.0*son/mom;
}
son++; //利用分子分母各自前后之间的关系
mom+=2;
}
printf("%.3f",sum);
return 0;
}
方法二
n分奇偶数,奇数和+偶数和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i;
double sum1=0,sum2=0;
if(n%2==0){ //n为偶数
//奇数和
for(i=1;i<=n/2;i++){
sum1+=1.0*(i*2-1)/(i*4-3);
}
//偶数和
for(i=1;i<=n/2;i++){
sum2+=1.0*(i*2)/(i*4-1);
}
} else{ //n为奇数
//奇数和
for(i=1;i<=(n+1)/2;i++){
sum1+=1.0*(i*2-1)/(i*4-3);
}
//偶数和
for(i=1;i<=(n-1)/2;i++){
sum2+=1.0*(i*2)/(i*4-1);
}
}
printf("%.3f",sum1-sum2);
return 0;
}
方法三
引入变量a=1,每次a=-a,实现正负
#include<stdio.h>
int main()
{
int n;
int a=1; //实现正负
double sum=0;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++){
sum+=a*(1.0*i/(2*i-1)); //利用一个分数分子分母的关系
a=-a; //这里
}
printf("%.3f",sum);
return 0;
}
方法四
利用-1的次方,实现正负
#include<stdio.h>
#include<math.h>
int main()
{
int n;
double sum=0;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++){
sum+=(1.0*i/(2*i-1))*pow(-1,i+1); //利用-1的次方
}
printf("%.3f",sum);
return 0;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了有关正负交错序列求和的4种方法,其实也都大同小异,希望可以帮助到大家。