藍橋杯數列求值

一、藍橋杯數列求值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,否則計算出數列的最後一項並輸出。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/156516.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 01:56
下一篇 2024-11-18 01:56

相關推薦

發表回復

登錄後才能評論