MT1421-MT1430 码题集 (c 语言详解)

目录

MT1421·异或

MT1422·总位数

MT1423·被3整除

MT1424·卡特兰序列

MT1425·小码哥的序列

MT1426·普洛尼克数

MT1427·素数序列

MT1428·最小素数因子

MT1429·最小正整数

MT1430·回文数组


MT1421·异或

给定一个由N(<1000)个整数组成的数组,把数组元素任意两两进行异或,统计数组中异或的结果为奇数的元素有几对,输出对数。

格式

输入格式:第一行输入数组长度N,第二行输入数组元素,整型,空格分隔。

输出格式:输出整型

样例 1

输入:3

1 2 3

输出:2

c 语言实现代码

方法一:

复制代码
#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    int array[100];
    for (int i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }
    // method one:

    int count_odd = 0;
    int count_even = 0;
    for (int i = 0; i < N; i++) {
        if (array[i] % 2 == 0) {
            count_even++;
         } else {
            count_odd++;
         }
     }
    int pairs = count_odd * count_even;
    printf("%d", pairs);

    return 0;
}

方法二:

复制代码
#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    int array[100];
    for (int i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }
    int count = 0;
    // 计算异或结果为奇数的对数
    for (int i = 0; i < N - 1; i++) {
        for (int j = i + 1; j < N; j++) {
            if ((array[i] ^ array[j]) % 2 != 0) {
                count++;
            }
        }
    }
    printf("%d", count);
    return 0;
}

MT1422·总位数

计算数组中N个元素所有数字的总位数。所有元素均为非负数。

格式

输入格式:第一行输入数组长度N(<100),第二行输入数组元素,整型,空格分隔。

输出格式:输出整型

样例 1

输入:14

1 2 3 4 5 6 7 8 9 10 11 12 13 14

输出:19

c 语言实现代码

复制代码
#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N);
    int array[N];

    // 输入数组元素
    for (int i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }

    int total_digits = 0;
    for (int i = 0; i < N; i++) {
        int num = array[i];
        if (num == 0) {
            total_digits++;
        }
        while (num > 0) {
            total_digits++;
            num /= 10;
        }
    }

    // 输出结果
    printf("%d\n", total_digits);
    return 0;
}

MT1423·被3整除

c 语言实现代码

复制代码
#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    int array[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }

    int total_digits_sum = 0;
    for (int i = 0; i < N; i++) {
        int num = array[i];
        while (num > 0) {
            total_digits_sum += num % 10; // 取出最后一位数字并加到总和
            num /= 10;                    // 去掉最后一位数字
        }
    }
    if (total_digits_sum % 3 == 0) {
        printf("YES");
    } else {
        printf("NO");
    }

    return 0;
}

MT1424·卡特兰序列

c 语言实现代码

复制代码
#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    if (N > 20)
        return 0;
    int catalan[N + 1];
    catalan[0] = 1;
    // 使用动态规划计算卡特兰数
    for (int i = 1; i <= N; i++) {
        catalan[i] = 0;
        for (int j = 0; j < i; j++) {
            catalan[i] += catalan[j] * catalan[i - 1 - j];
        }
    }

    printf("%d", catalan[N]);

    return 0;
}

MT1425·小码哥的序列

c 语言实现代码

复制代码
#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N);

    // 如果N小于1,直接返回
    if (N < 1) {
        printf("N必须大于或等于1。\n");
        return 1;
    }

    // 序列的前几项
    int sequence[10000]; // 假设最大为100项
    sequence[0] = 1;   // 第1项
    sequence[1] = 2;   // 第2项
    sequence[2] = 5;   // 第2项

    // 根据规律生成序列,直到第N项
    for (int i = 3; i < N; i++) {
        sequence[i] = sequence[i - 1] + sequence[i - 2] + sequence[i - 3];
    }

    // 输出第N项
    printf("%d\n", sequence[N - 1]);
    return 0;
}

MT1426·普洛尼克数

c 语言实现代码

复制代码
#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);

    for (int i = 0;; i++) {
        int plonikNumber = i * (i + 1);
        if (plonikNumber > N) {
            break;
        }
        printf("%d ",plonikNumber);
    }

    return 0;
}

MT1427·素数序列

c 语言实现代码

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 10000

int isPrimeDigit(int num) {
    while (num > 0) {
        int digit = num % 10;
        if (digit != 2 && digit != 3 && digit != 5 && digit != 7) {
            return 0;
        }
        num /= 10;
    }
    return 1;
}

int main() {
    int N;
    scanf("%d", &N);
    int count = 0;
    int number = 1;

    while (count < N) {
        if (isPrimeDigit(number)) {
            count++;
        }
        number++; /*  */
    }

    printf("%d", number - 1);

    return 0;
}

MT1428·最小素数因子

c 语言实现代码

复制代码
#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    if (N <= 0 || N > 1000)
        return 0;
    int minmum_prime_factor[1001];
    // 初始化数组
    for (int i = 1; i <= N; i++) {
        if (i == 1) {
            minmum_prime_factor[i] = 1;
        }
        minmum_prime_factor[i] = i;
    }

    // 计算最小素数因子
    for (int i = 2; i <= N; i++) {
        if (minmum_prime_factor[i] == i) {
            for (int j = 2 * i; j <= N; j += i) {
                if (minmum_prime_factor[j] == j) {
                    minmum_prime_factor[j] = i;
                }
            }
        }
    }

    for (int i = 1; i <= N; i++) {
        printf("%d ", minmum_prime_factor[i]);
    }

    return 0;
}

MT1429·最小正整数

c 语言实现代码

复制代码
#include <math.h>
#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N);

    int arr[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
    //  method 1:
    // // 计算数组的乘积 P
    // double product = 1;
    // for (int i = 0; i < N; i++) {
    //     product *= arr[i];
    // }

    // // 找到最小的 K,使得 K^N > product
    // int K = 1;
    // while (pow(K, N) <= product) {
    //     K++;
    // }

    // printf("%d\n", K);

    //  method 2:
    double log_product = 0;
    for (int i = 0; i < N; i++) {
        log_product += log(arr[i]);
    }

    // 计算 k 的下界
    double log_k = log_product / N;
    int k = (int)ceil(exp(log_k));

    while (pow(k, N) <= exp(log_product)) {
        k++;
    }
    printf("%d", k);

    return 0;
}

MT1430·回文数组

c 语言实现代码

复制代码
#include <stdio.h>
#include <string.h>

int isPalindrome(int num) {
    char str[10];
    sprintf(str, "%d", num);
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len - i - 1]) {
            return 0; // 不是回文数
        }
    }
    return 1; // 是回文数
}
int main() {
    int N;
    scanf("%d", &N);
    int count = 0; // 计数
    for (int i = 1; i < N; i++) {
        if (isPalindrome(i)) {
            count++;
        }
    }
    printf("%d", count);
    return 0;
}
相关推荐
moxiaoran575313 分钟前
uni-app学习笔记二十九--数据缓存
笔记·学习·uni-app
C++ 老炮儿的技术栈38 分钟前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
殇者知忧40 分钟前
【论文笔记】若干矿井粉尘检测算法概述
深度学习·神经网络·算法·随机森林·机器学习·支持向量机·计算机视觉
wgslucky44 分钟前
Dubbo报错:module java.base does not “opens java.lang“ to unnamed module
java·开发语言·dubbo
whyeekkk1 小时前
python打卡第48天
开发语言·python
pop_xiaoli2 小时前
OC—UI学习-2
学习·ui·ios
Lin Hsüeh-ch'in2 小时前
Vue 学习路线图(从零到实战)
前端·vue.js·学习
DougLiang2 小时前
关于easyexcel动态下拉选问题处理
java·开发语言
mochensage2 小时前
CSP信奥赛C++常用系统函数汇总
c++·信奥
mochensage2 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法