现一个函数f(x),它满足:
f[1] = a, f[2] = b, f[3] = c;
f[n] = 函数前n-1项中偶数的个数(n>=3);
请求出这个数列的前m项和
输入四个正整数数对应题目中的a,b,c,m(保证都小于100)
输出
输入前m项和
3 1 2 5
8
对于样例:f[4]=f[5]=1
首先对于这一个问题,我们是知道前三项的,因为给出的函数是递归定义的,也就是我们要求 f ( n ) f(n) f(n)就需要先求出前n-1项都是偶数还是奇数,所以我们可以采用两种方法解决这一个问题。
方法一:
#include<stdio.h>
#include<stdlib.h>
int main(){
int a,b,c,m, sum=0;
scanf("%d %d %d %d", &a, &b, &c, &m);
int *num = (int *)malloc(sizeof(int)*m);
num[0] = a;
num[1] = b;
num[2] = c;
for(int i=3; i<m; i++){
int even = 0;
for(int j = 0; j < i; j++){
if(num[j]%2 == 0){
even += 1;
}
}
num[i] = even;
}
for(int i=0; i<m; i++){
sum += num[i];
}
printf("%d", sum);
return 0;
}
方法二:
#include<stdio.h>
int main(){
int a[3],m,sum=0;
int even = 0;
scanf("%d %d %d %d", &a[0], &a[1], &a[2], &m);
for(int i = 1; i <= 3; i++){
if(a[i-1] % 2 == 0){
even += 1;
}
if(i <= m){
sum += a[i-1];
}
}
for(int i=3; i < m; i++){
sum += even;
if(even%2 == 0){ // 因为偶数的个数就是序列中下一个元素的值,所以直接加上even就行了。
even += 1;
}
}
printf("%d", sum);
return 0;
}
显然方法二要优于方法一。