目录
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;
}