一、蓝桥杯数列求值C语言
#include<stdio.h>
int main() {
int n, s = 0;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
int cur = 1;
for(int j = 1; j <= i; ++j) {
cur *= j;
}
s += cur;
}
printf("%d", s);
return 0;
}
蓝桥杯数列求值是蓝桥杯历年真题中经常出现的一道题目,题目描述:求1!+2!+3!+...+n!的和。 以上是蓝桥杯数列求值的C语言代码,使用循环语句进行了累加计算。
二、蓝桥杯数列排序C语言
#include<stdio.h>
int main() {
int n, a[101];
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for(int i = 0; i < n - 1; ++i) {
for(int j = i + 1; j < n; ++j) {
if(a[j] < a[i]) {
int tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
for(int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
return 0;
}
蓝桥杯数列排序是另外一道经常考察的蓝桥杯题目,题目描述:输入n和n个数,按从小到大的顺序输出这n个数。 以上是蓝桥杯数列排序的C语言代码,使用选择排序的思路进行了实现。
三、蓝桥杯等差素数列
蓝桥杯等差素数列是较为复杂的一道蓝桥杯数列题目,题目描述:给定首项a、项数n和公差d,构造一个首项是a,公差是d,长度是n的等差数列,然后筛选出素数,输出剩余数列的和。 以下是该题的C语言代码实现:
#include<stdio.h>
#include<math.h>
int is_prime(int x) {
if(x <= 1) return 0;
int m = sqrt(x);
for(int i = 2; i <= m; ++i) {
if(x % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int a, n, d, s = 0;
scanf("%d %d %d", &a, &n, &d);
for(int i = 0; i < n; ++i) {
int cur = a + i * d;
if(is_prime(cur)) {
continue;
}
s += cur;
}
printf("%d", s);
return 0;
}
代码中使用了一个判断素数的函数is_prime()
,较为复杂。除此之外,就是对等差数列进行了筛选和求和计算。
四、蓝桥杯接龙数列
蓝桥杯接龙数列是一道非常有趣的蓝桥杯数列题目,题目描述:给定长度为n的一个由大写字母组成的字符串s,设s[i]表示s的第i个字符,求由s[1]开始的一个数列,直到不能继续为止,使得这个数列中每个数字的各个位数之和等于下一个数字的个位数。 以下是该题的C语言代码实现:
#include<stdio.h>
#include<string.h>
int sum_digit(int x) {
int s = 0;
while(x) {
s += x % 10;
x /= 10;
}
return s;
}
int main() {
char s[101];
scanf("%s", s);
int len = strlen(s), cur = s[0] - 'A' + 1;
printf("%d ", cur);
for(int i = 1; i < len; ++i) {
int nxt = s[i] - 'A' + 1;
while(cur % 10 + nxt != sum_digit(cur)) {
++cur;
}
printf("%d ", cur);
}
return 0;
}
代码中使用了一个计算整数各个位数之和的函数sum_digit()
,较为简单。除此之外,就是对字符串中的字符进行了转化成整数,并依次判断是否能够满足条件,找到符合条件的数字后输出并进行迭代。
五、蓝桥杯异或数列
蓝桥杯异或数列是一道较为抽象的蓝桥杯数列题目,题目描述:输入n和n个数,对这n个数按从小到大的顺序异或计算,输出结果。 以下是该题的C语言代码实现:
#include<stdio.h>
int main() {
int n, a[101];
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int s = a[0];
for(int i = 1; i < n; ++i) {
s ^= a[i];
}
printf("%d", s);
return 0;
}
代码中使用了异或运算符^
,对数组中的数依次进行异或计算。
六、蓝桥杯数列排序
蓝桥杯数列排序是之前讲解的一道蓝桥杯题目,但是除了可以使用选择排序之外,还可以使用快速排序实现,以下是代码实现:
#include<stdio.h>
int partition(int a[], int l, int r) {
int x = a[r], i = l - 1;
for(int j = l; j < r; ++j) {
if(a[j] <= x) {
++i;
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
int tmp = a[i + 1];
a[i + 1] = a[r];
a[r] = tmp;
return i + 1;
}
void quick_sort(int a[], int l, int r) {
if(l < r) {
int q = partition(a, l, r);
quick_sort(a, l, q - 1);
quick_sort(a, q + 1, r);
}
}
int main() {
int n, a[101];
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
quick_sort(a, 0, n - 1);
for(int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
return 0;
}
代码中使用了快速排序的思路,通过确定一个轴进行分治计算,最后进行排序完成。
七、蓝桥杯波动数列
蓝桥杯波动数列是一道比较少见的蓝桥杯数列题目,题目描述:输入n和n个数,将这n个数依次看做折线上纵坐标,求这个折线图中交点的数量。 以下是该题的C语言代码实现:
#include<stdio.h>
int main() {
int n, a[101], cnt = 0;
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for(int i = 1; i < n - 1; ++i) {
if((a[i] - a[i - 1]) * (a[i + 1] - a[i]) < 0) {
++cnt;
}
}
printf("%d", cnt);
return 0;
}
代码中通过遍历数组计算出所有的交点,输出计数器的值作为结果。
八、蓝桥杯等差数列
蓝桥杯等差数列是之前讲解到的蓝桥杯数列题目,以下是不同于选择排序的另一种等差数列排序的C语言实现:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int main() {
int n, a[101];
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), cmp);
int d = a[1] - a[0];
for(int i = 2; i < n; ++i) {
if(a[i] - a[i - 1] != d) {
printf("Impossible");
return 0;
}
}
printf("%d", a[0] + (n - 1) * d);
return 0;
}
代码中使用了快速排序的库函数qsort()
进行了从小到大的排序,然后再进行等差判断。如果相邻两项不等于公差,则判定不是等差数列,输出Impossible,否则计算出数列的最后一项并输出。