目录
sdut-array2-5 打印“杨辉三角“ 品中国数学史 增民族自豪感(2)
素数对猜想
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
void init(int n, bool *is, int *pre, int *cnt) {
for (int i = 2; i <= n; i++) {
if (!is[i]) pre[(*cnt)++] = i;
for (int j = 0; j < *cnt; j++) {
int product = pre[j] * i;
if (product > n) break;
is[product] = true;
if (i % pre[j] == 0) break;
}
}
}
int main() {
int n;
scanf("%d", &n);
// 动态分配数组
bool *is = calloc(n + 1, sizeof(bool)); // 初始化为 false(分配内存并初始化)
int *pre = malloc((n + 1) * sizeof(int));
int cnt = 0;
init(n, is, pre, &cnt);
int ans = 0;
for (int i = 1; i < cnt; i++) {
if (pre[i] - pre[i-1] == 2) ans++;
}
printf("%d\n", ans);
free(is);
free(pre);
return 0;
}
在C语言中,malloc
只需要一个参数,即要分配的总字节数。
calloc
不仅分配内存,还会将分配的内存初始化为零(对于数值类型,如 int
和 bool
,这意味着初始化为 false
)。
找出不是两个数组共有的元素
给定两个整型数组,本题要求找出不是两者共有的元素。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
int main() {
int n, m;
scanf("%d", &n);
int *a = malloc(n*sizeof(int));
for (int i = 0; i<n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &m);
int *b = malloc(m*sizeof(int));
for (int i = 0; i<m; i++){
scanf("%d", &b[i]);
}
int *c = malloc((n+m)*sizeof(int));
int k =0;
for (int i = 0; i<n; i++){
int flag = 0;
for (int j = 0; j<m; j++){
if (a[i] == b[j]) {
flag = 1;
break;
}
}
if (flag == 0) c[k++] = a[i];
}
for (int i = 0; i<m; i++){
int flag = 0;
for (int j = 0; j<n; j++){
if (b[i] == a[j]) {
flag = 1;
break;
}
}
if (flag == 0) c[k++] = b[i];
}
for (int i = 0; i<k; i++){
for (int j = i+1; j<k; j++){
if (c[i] == c[j]){
for (int l = j+1; l<k; l++){
c[l-1] = c[l];
}
k--;
}
}
}
for (int i = 0; i<k; i++){
if (i == 0){
printf("%d", c[i]);
}
else printf(" %d", c[i]);
}
return 0;
}
统计不同数字字符出现次数
从键盘读入一行字符(约定:字符数≤127字节),统计并显示该行字符中10个数字字符各自出现的次数,没有出现的字符不显示。如果没有数字字符,则输出"None!"。
输入样例
a053 JHSa 5we !=-)35xhyasei..df
输出样例
0-1
3-2
5-3
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
int n, m;
char a[128];
gets(a);
int num[10] = {0};
for (int i = 0; i<strlen(a); i++){
if (a[i] >= '0' && a[i] <= '9'){
num[a[i]-'0']++;
}
}
int flag = 0;
for (int i = 0; i<10; i++){
if (num[i] != 0){
printf("%d-%d\n", i, num[i]);
flag = 1;
}
}
if (!flag){
printf("None!");
}
return 0;
}
组个最小数
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
int main() {
int n, m;
int num[10] = {0};
for (int i = 0; i<10; i++){
scanf("%d", &num[i]);
}
for (int i = 1; i<10; i++){
if (num[i] != 0){
printf("%d", i);
num[i]--;
break;
}
}
for (int i = 0; i<10; i++){
while (num[i]){
printf("%d", i);
num[i]--;
}
}
return 0;
}
单词长度
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.
结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's
算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.
不计算在内。
输入样例:
It's great to see you here.
输出样例:
4 5 2 3 3 4
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char ch;
int num = 0, cnt = 0;
int flag = 0;
scanf("%c", &ch);
while (ch != '.'){
if (ch == ' '){
if (num != 0){
if (cnt == 0){
printf("%d", num);
}
else printf(" %d", num);
cnt++;
}
num = 0;
}
else num++;
scanf("%c", &ch);
}
if (num != 0){
if (cnt == 0){
printf("%d", num);
}
else printf(" %d", num);
}
return 0;
}
IP地址转换
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入样例:
11001100100101000001010101110010
输出样例:
204.148.21.114
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char ch;
for (int i = 0; i<4; i++){
int s = 0;
for (int j = 0; j<8; j++){
scanf("%c", &ch);
s = s*2+ch-'0';
}
printf("%d", s);
if (i != 3){
printf(".");
}
}
return 0;
}
找鞍点
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
struct node{
int x, y;
};
int max(int a, int b){
if (a > b){
return a;
}
else return b;
}
int min(int a, int b){
return (a < b) ? a : b;
}
int main() {
int n;
scanf("%d", &n);
int a[n][n];
for (int i = 0; i<n; i++){
for (int j=0; j<n; j++){
scanf("%d", &a[i][j]);
}
}
int h[n], l[n];
for (int i = 0; i<n; i++){
int max_h = 0, min_l = 10000;
for (int j = 0; j<n; j++){
max_h = max(max_h, a[i][j]);
min_l = min(min_l, a[j][i]);
}
h[i] = max_h;
l[i] = min_l;
}
struct node *p = (struct node*)malloc((n*n)*sizeof(struct node));
int cnt = 0;
for (int i = 0; i<n; i++){
for (int j = 0; j<n; j++){
if (a[i][j] == h[i] && a[i][j] == l[j]){
p[cnt].x = i;
p[cnt++].y = j;
}
}
}
if (cnt == 0){
printf("NONE");
}
else{
for (int i = 0; i<cnt; i++){
printf("%d %d\n", p[i].x, p[i].y);
}
}
return 0;
}
通讯录排序
输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入样例:
3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
输出样例:
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
struct student{
char name[10];
int birth;
char phone[17];
}stu[10], stu1;
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i<n; i++){
scanf("%s %d %s", stu[i].name, &stu[i].birth, stu[i].phone);
}
for (int i = 0; i<n-1; i++){
for (int j = 0; j<n-1-i; j++){
if (stu[j].birth > stu[j+1].birth){
stu1 = stu[j];
stu[j] = stu[j+1];
stu[j+1] = stu1;
}
}
}
for (int i = 0; i<n; i++){
printf("%s %d %s\n", stu[i].name, stu[i].birth, stu[i].phone);
}
return 0;
}
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
struct student{
char name[10];
int birth;
char phone[17];
}stu[10], stu1;
int cmp(const void *a, const void *b){
return (((struct student*)a)->birth - ((struct student*)b)->birth);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i<n; i++){
scanf("%s %d %s", stu[i].name, &stu[i].birth, stu[i].phone);
}
qsort(stu, n, sizeof(struct student), cmp);
for (int i = 0; i<n; i++){
printf("%s %d %s\n", stu[i].name, stu[i].birth, stu[i].phone);
}
return 0;
}
统计期末成绩
程序设计校选课期末计划安排在第十五周周五下午,有学生反映第十五周周末恰逢端午节假期,已请假提前回家。
经过协商,该课程期末考试共进行两次,分别在第十五周周五下午和第十六周周五下午。
如果学生两次考试都参加,则该课程期末成绩取两次成绩最高分。如果只参加了一次,则该次成绩即为期末考试成绩。
请你帮老师统计下每个学生该门课程的期末成绩。
输入样例:
3
201410300106 wanyun 70 88
201618050322 zhangyu 90 0
201509210118 lixiao 0 0
输出样例:
201410300106 wanyun 88
201509210118 lixiao 0
201618050322 zhangyu 90
AC代码:
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LENGTH 21
#define MAX_STUDENTS 10
typedef struct {
char id[16];
char name[MAX_NAME_LENGTH];
int score1;
int score2;
} Student;
int compareStudents(const void *a, const void *b) {
return strcmp(((Student *)a)->id, ((Student *)b)->id);
}
int main() {
int n;
scanf("%d", &n);
Student students[MAX_STUDENTS];
for (int i = 0; i < n; i++) {
scanf("%s %s %d %d", students[i].id, students[i].name, &students[i].score1, &students[i].score2);
}
// 对学生按照学号进行排序
qsort(students, n, sizeof(Student), compareStudents);
for (int i = 0; i < n; i++) {
int finalScore = (students[i].score1 > students[i].score2) ? students[i].score1 : students[i].score2;
printf("%s %s %d\n", students[i].id, students[i].name, finalScore);
}
return 0;
}
qsort
函数:
qsort
是 C 标准库中的一个函数,用于对数组进行排序。它的原型定义在<stdlib.h>
头文件中。- 函数原型:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
-
void *base
: 这是指向要排序的数组的起始地址的指针。base
是一个void*
类型的指针,因此它可以指向任何类型的数组。 -
size_t nmemb
: 这是数组中元素的个数。nmemb
是一个size_t
类型的值,表示数组中要排序的元素数量。 -
size_t size
: 这是数组中每个元素的大小(以字节为单位)。size
是一个size_t
类型的值,表示数组中每个元素占用的内存大小。 -
int (*compar)(const void *, const void *)
: 这是一个指向比较函数的指针。比较函数用于确定数组中两个元素的顺序。compar
函数接收两个const void*
类型的指针,分别指向要比较的两个元素。
compareStudents
参数:
compareStudents
是一个函数指针,指向一个比较函数。- 比较函数的原型:
int compareStudents(const void *a, const void *b);
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LENGTH 21
#define MAX_STUDENTS 10
typedef struct {
char id[16];
char name[MAX_NAME_LENGTH];
int s1;
int s2;
} Student;
int main() {
int n;
scanf("%d", &n);
Student stu[MAX_STUDENTS], stu1;
for (int i = 0; i < n; i++) {
scanf("%s %s %d %d", stu[i].id, stu[i].name, &stu[i].s1, &stu[i].s2);
}
for (int i = 0; i<n-1; i++){
for (int j = 0; j<n-i-1; j++){
if (strcmp(stu[j].id, stu[j+1].id) > 0){
stu1 = stu[j];
stu[j] = stu[j+1];
stu[j+1] = stu1;
}
}
}
for (int i = 0; i < n; i++) {
int finalScore = (stu[i].s1 > stu[i].s2) ? stu[i].s1 : stu[i].s2;
printf("%s %s %d\n", stu[i].id, stu[i].name, finalScore);
}
return 0;
}
选民投票
编程统计候选人的得票数。有若干位候选人(n<=10),候选人姓名从键盘输入(候选人姓名不区分大小写,姓名最长为9个字节),若干位选民,选民每次输入一个得票的候选人的名字(姓名最长为9个字节),若选民输错候选人姓名,则按废票处理。程序自动统计各候选人的得票结果,并按照得票数由高到低的顺序排序。最后输出各选票人得票结果和废票信息。
输入样例1:
3
zhang
li
wang
9
Wang
Zhang
zhuang
LI
Liao
ZHANG
WANG
Wang
wang
输出样例1:
wang:4
zhang:2
li:1invalid vote:
zhuang
Liao
输入样例2:
2
liu
yang
5
Liu
liu
YANG
yang
Liu
输出样例2:
liu:3
yang:2
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
struct candidate{
char name[20];
int sum;
};
int cmp(const void *a, const void *b){
return (((struct candidate*)b)->sum) - (((struct candidate *)a)->sum);
}
int main() {
int n;
scanf("%d", &n);
struct candidate s[n];
for (int i = 0; i<n; i++){
s[i].sum = 0;
}
for (int i = 0; i<n; i++){
scanf("%s", s[i].name);
}
int m, invalid_num = 0;;
scanf("%d", &m);
char invalid[86][10];
for (int i = 0; i<m; i++){
char name[20];
int cnt = 0;
scanf("%s", name);
for (int j = 0; j<n; j++){
int flag = 0;
for (int k = 0; name[k]!= '\0'; k++){
if (name[k]!= s[j].name[k] && name[k] != s[j].name[k]+32 && name[k]!= s[j].name[k]-32){
flag=1;
cnt++;
break;
}
}
if (flag == 0){
s[j].sum++;
break;
}
}
if (cnt == n){
strcpy(invalid[invalid_num++], name);
}
}
qsort(s, n, sizeof(struct candidate), cmp);
for (int i = 0; i<n; i++){
printf("%s:%d\n", s[i].name, s[i].sum);
}
if (invalid_num){
printf("\ninvalid vote:\n");
for (int i = 0; i<invalid_num; i++){
printf("%s\n", invalid[i]);
}
}
return 0;
}
歌唱比赛计分
设有10名歌手(编号为1-10)参加歌咏比赛,另有6名评委打分,每位歌手的得分从键盘输入,计算出每位歌手的最终得分(扣除一个最高分和一个最低分后的平均分),最后按最终得分由高到低的顺序输出每位歌手的编号及最终得分。
输入样例:
1 4 7 3 6 3
8 7 8 5 9 8
7 5 6 8 5 4
7 6 7 5 6 5
3 5 6 7 5 5
7 7 7 8 9 6
7 7 6 7 6 8
9 4 3 7 3 6
4 8 6 7 5 8
8 7 8 8 9 8
输出样例:
No.10: 8.00
No.2 : 7.75
No.6 : 7.25
No.7 : 6.75
No.9 : 6.50
No.4 : 6.00
No.3 : 5.75
No.5 : 5.25
No.8 : 5.00
No.1 : 4.00
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
struct singer{
int id;
float s;
};
int max(int a, int b){
return a > b?a : b;
}
int min(int a, int b){
return a < b?a : b;
}
int main() {
struct singer si[10], s1;
for (int i = 0; i<10; i++){
int l=0, r=10;
float su = 0;
for (int j = 1; j<=6; j++){
int x;
scanf("%d", &x);
su += x;
l = max(l, x);
r = min(r, x);
}
su -= (l+r);
si[i].id = i+1;
si[i].s = su/4;
}
for (int i = 0; i<9; i++){
for (int j = 0; j<10-1-i; j++){
if (si[j].s < si[j+1].s){
s1 = si[j];
si[j] = si[j+1];
si[j+1] = s1;
}
}
}
for (int i = 0; i<10; i++){
printf("No.%-2d: %.2f\n", si[i].id, si[i].s);
}
return 0;
}
判断两个字符串是否为变位词
如果一个字符串是 另一个字符串的重新排列组合,那么这两个字符串互为变位词。比如,”heart”与”earth”互为变位 词,”Mary”与”arMy”也互为变位词。
输入样例1:
Mary
arMy
输出样例1
yes
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
void pai(char *s){
char ch;
for (int i = 0; i<strlen(s)-1; i++){
for (int j = 0; j<strlen(s)-1-i; j++){
if (s[j] > s[j+1]){
ch = s[j];
s[j] = s[j+1];
s[j+1] = ch;
}
}
}
}
int main() {
char s1[100], s2[100];
gets(s1);
gets(s2);
pai(s1);
pai(s2);
if (strcmp(s1, s2) == 0){
printf("yes\n");
}
else printf("no\n");
return 0;
}
求矩阵的局部极大值
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
struct node{
int val, x, y;
};
int main() {
int n, m;
scanf("%d %d", &m, &n);
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
struct node submax[500];
int a[m][n];
for (int i = 0; i<m;i++){
for (int j = 0; j<n; j++){
scanf("%d", &a[i][j]);
}
}
int cnt = 0;
for (int i = 1; i<m-1; i++){
for (int j = 1; j<n-1; j++){
int flag = 0;
for (int k = 0; k<4; k++){
if (a[i][j] <= a[i+dx[k]][j+dy[k]]){
flag = 1;
break;
}
}
if (!flag) {
submax[cnt].val = a[i][j];
submax[cnt].x= i+1;
submax[cnt++].y=j+1;
}
}
}
if (!cnt){
printf("None %d %d\n", m, n);
}
else {
for (int i=0; i<cnt; i++){
printf("%d %d %d\n", submax[i].val, submax[i].x, submax[i].y);
}
}
return 0;
}
最长最短单词
输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
输入样例:
I am studying Programming language C in Peking University
输出样例:
Programming
I
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char str[220][101], chstr[101];
gets(chstr);
int len = strlen(chstr);
int str_num = 0, num = 0;
for (int i = 0; i<len; i++){
if (chstr[i] == ' ' || chstr[i] == ','){
if (num > 0) str_num++;
num = 0;
}
else {
str[str_num][num++] = chstr[i];
}
}
char max_str[101];
strcpy(max_str, str[0]);
char min_str[101];
strcpy(min_str, str[0]);
int max_num = strlen(max_str);
int min_num = strlen(min_str);
for (int i = 0; i<str_num; i++){
if (strlen(str[i]) > max_num){
max_num = strlen(str[i]);
strcpy(max_str, str[i]);
}
if (strlen(str[i]) < min_num){
min_num = strlen(str[i]);
strcpy(min_str, str[i]);
}
}
puts(max_str);
puts(min_str);
return 0;
}
sdut-array2-5 打印“杨辉三角“ 品中国数学史 增民族自豪感(2)
输入样例:
5
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
int n;
scanf("%d", &n);
int a[n][n];
for (int i = 0; i<n; i++){
for (int j = 0; j<=i; j++){
if (i == j || j==0) a[i][j] = 1;
else a[i][j] = a[i-1][j-1]+a[i-1][j];
}
}
for (int i=0; i<n; i++){
for (int j = 0; j<n-1-i; j++){
printf(" ");
}
for (int j = 0; j<=i; j++){
printf("%-4d", a[i][j]);
if (j == i) printf("\n");
}
}
return 0;
}
1000以内所有各位数字之和为n的正整数
输出1000以内所有各位数字之和为n的正整数,例如:如果输入的n是6,那么,105的各位数字之和1+0+5=6, 123的各位数字之和1+2+3=6,两者都满足要求。每行输出6列,每个整数占8位宽度右对齐。
输入样例:
6
输出样例:
6 15 24 33 42 51
60 105 114 123 132 141
150 204 213 222 231 240
303 312 321 330 402 411
420 501 510 600
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
int n;
scanf("%d", &n);
int ans = 0;
for (int i = 1; i<=1000; i++){
int cnt = 0;
int num = i;
while (num){
cnt += num%10;
num/=10;
}
if (cnt == n){
ans++;
printf("%8d", i);
if (ans % 6 == 0) printf("\n");
}
}
// printf("\n");
return 0;
}
统计素数并求和
输入样例:
10 31
输出样例:
7 143
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
// 欧拉筛
int main() {
int m, n;
scanf("%d %d", &m, &n);
bool is[505];
int pre[505], num=0;
int ans_1 = 0, ans_2=0;
for (int i = 2; i<=n; i++){
if (!is[i]) {
pre[num++]=i;
if (i>=m && i<=n){
ans_1++;
ans_2+=i;
}
}
for (int j = 0; j<num; j++){
if (i*pre[j] > n) break;
is[i*pre[j]] = true;
if (i % pre[j] == 0) break;
}
}
printf("%d %d\n", ans_1, ans_2);
return 0;
}
求一定范围内的所有完数
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如:6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出任意两正整数m和n之间的所有完数。
输入样例:
3 30
输出样例:
6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
// 欧拉筛
int main() {
int m, n;
scanf("%d %d", &m, &n);
int sum, flag = 0;
for (int i = m; i<=n; i++){
sum = 0;
for (int j = 1; j<i; j++){
if (i%j == 0) sum += j;
}
if (sum == i){
flag = 1;
printf("%d its factors are 1",i);
for (int j = 2; j<i; j++){
if (i % j == 0){
printf(",%d", j);
}
}
printf("\n");
}
}
if (flag == 0){
printf("Not Found!");
}
return 0;
}
最大公约数和最小公倍数
本题要求两个给定正整数的最大公约数和最小公倍数。
输入样例:
511 292
输出样例:
73 2044
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int gcd(int a, int b){
return b == 0?a:gcd(b, a%b);
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
printf("%d %d\n", gcd(n, m), n*m/gcd(n,m));
return 0;
}
求整数序列中出现次数最多的数
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
输入样例:
10 3 2 -1 5 3 4 3 0 3 2
输出样例:
3 4
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
int n;
scanf("%d", &n);
int a[n];
for (int i = 0; i<n; i++){
scanf("%d", &a[i]);
}
int max_num = a[0], max = 1;
for (int i = 1; i<n; i++){
int cnt = 1;
for (int j = 0; j<i; j++){
if (a[i] == a[j]){
cnt++;
}
}
if (cnt > max){
max = cnt;
max_num = a[i];
}
}
printf("%d %d\n", max_num, max);
return 0;
}
求一批整数中出现最多的个位数字
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入样例:
3
1234 2345 3456
输出样例:
3: 3 4
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int max(int a, int b){
return a > b? a : b;
}
int main() {
int n;
scanf("%d", &n);
int num[10]={0};
int max_num = 0;
for (int i = 0; i<n; i++){
int x;
scanf("%d", &x);
while (x){
num[x%10]++;
max_num = max(max_num, num[x%10]);
x/=10;
}
}
printf("%d:", max_num);
for (int i = 0; i<10; i++){
if (num[i] == max_num){
printf(" %d", i);
}
}
return 0;
}
简单选择排序显示第K趟
将N个整数按从小到大排序的选择排序法是这样工作的:选择所有数中最大(小)的,与最后一个(第一个)交换。通过一遍扫描,则最后一个元素必定是最大的元素(或第一个元素必定是最小的元素)。然后用同样的方法余下的N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,即完成对N个数的排序。
本题要求对任意给定的K(<N)按找大的原则,输出扫描完第K遍后的中间结果数列。
输入样例:
6 2
2 3 5 1 6 4
输出样例:
2 3 4 1 5 6
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
int n, k;
scanf("%d %d", &n, &k);
int a[n];
for (int i=0; i<n; i++){
scanf("%d", &a[i]);
}
for (int i = 0; i<k; i++){
int max = a[0], pos = 0;
for (int j = 1; j<n-i; j++){
if (a[j] > max){
max = a[j];
pos = j;
}
}
int temp = a[pos];
a[pos] = a[n-1-i];
a[n-1-i] = temp;
}
for (int i = 0; i<n; i++){
if (i == 0) printf("%d", a[i]);
else printf(" %d", a[i]);
}
return 0;
}
统计字符
本题目要求从键盘读入一串字符,以回车结束。分别统计其中的英文字母、数字、空格和其他字符的数量。
输入样例:
w1e2r3t AGH4--# 23 %%**
输出样例:
字母:7,数字:6,空格:5,其他:7
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char str[128];
gets(str);
int letter = 0, num = 0, space = 0, other = 0;
for (int i = 0; i<strlen(str); i++){
if ((str[i]>='a' && str[i] <='z') || (str[i]>='A' && str[i]<='Z')){
letter++;
}
else if (str[i] >= '0' && str[i] <= '9'){
num++;
}
else if (str[i] == ' ') space++;
else other++;
}
printf("字母:%d,数字:%d,空格:%d,其他:%d\n", letter, num, space, other);
return 0;
}
统计大写辅音字母
英文辅音字母是除A
、E
、I
、O
、U
以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。
输入样例:
HELLO World!
输出样例:
4
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char str[128];
gets(str);
char p[5] = {'A', 'E', 'I', 'O', 'U'};
int num = 0;
for (int i = 0; i<strlen(str); i++){
int cnt = 0;
for (int j = 0; j<5; j++){
if (str[i] != p[j]) cnt++;
}
if (cnt == 5 && str[i]>='A' && str[i]<='Z') num++;
}
printf("%d\n", num);
return 0;
}
字符串解压
输入压缩后的字符串,输出压缩前的字符串。
压缩的方法是把连续的相同字母压缩为"长度+字母"的形式,在本题中,单个的字母不需要压缩。
输入样例:
12ab10c2ax
输出样例:
aaaaaaaaaaaabccccccccccaax
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char str[128];
gets(str);
for (int i = 0; i<strlen(str); i++){
int sum = 0;
while (str[i]>='0' && str[i]<='9'){
sum = sum*10+str[i++]-'0';
}
for (int j = 0; j<sum; j++){
putchar(str[i]);
}
if (sum == 0){
putchar(str[i]);
}
}
return 0;
}
判断上三角矩阵
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入样例:
3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6
输出样例:
YES
NO
NO
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
void solve(){
int n;
scanf("%d", &n);
int x, flag = 0;
for (int i = 0; i<n; i++){
for (int j = 0; j<n; j++){
scanf("%d", &x);
if (i>j && x!=0) flag = 1;
}
}
if (flag){
printf("NO\n");
}
else{
printf("YES\n");
}
}
int main() {
int t;
scanf("%d", &t);
for (int i = 0; i<t; i++) solve();
return 0;
}
字符串排序
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入样例:
red yellow blue black white
输出样例:
After sorted:
black
blue
red
white
yellow
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
int main() {
char str[5][85];
for (int i = 0; i<5; i++){
scanf("%s", str[i]);
}
for (int i = 0; i<4; i++){
for (int j = 0; j<4-i; j++){
if (strcmp(str[j], str[j+1]) > 0){
char temp[85];
strcpy(temp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], temp);
}
}
}
printf("After sorted:\n");
for (int i= 0; i<5; i++){
printf("%s\n", str[i]);
}
}
学生信息的那些操作:(5)添加记录
有一学生成绩表,包括学号、姓名、3门课程成绩。已知该成绩表按学号升序排序。请编程实现,添加一个新的学生信息,且使成绩表仍按学号有序;若待添加的学号与已有学号重复,则输出错误信息,拒绝添加。
输入样例:
3
202016040201 Zhangling 78 95 55
202016040202 Wangli 87 99 88
202016040204 Fangfang 68 76 75
202016040203 Lilei 68 79 82
输出样例:
202016040201 Zhangling 78 95 55
202016040202 Wangli 87 99 88
202016040203 Lilei 68 79 82
202016040204 Fangfang 68 76 75
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
typedef struct{
char id[13], name[21];
int s1, s2, s3;
}stu;
int main() {
int n;
scanf("%d", &n);
stu s[n+1], ss;
for (int i = 0; i<n; i++){
scanf("%s %s %d %d %d", s[i].id, s[i].name, &s[i].s1, &s[i].s2, &s[i].s3);
}
scanf("%s %s %d %d %d", s[n].id, s[n].name, &s[n].s1, &s[n].s2, &s[n].s3);
int flag = 0;
for (int i = 0; i<n; i++){
if (strcmp(s[i].id, s[n].id) == 0){
flag = 1;
break;
}
}
if (flag){
printf("error!\n");
}
else{
for (int i = 0; i<n; i++){
for (int j = 0; j<n-i; j++){
if (strcmp(s[j].id, s[j+1].id) > 0){
ss = s[j];
s[j] = s[j+1];
s[j+1] = ss;
}
}
}
for (int i = 0; i<=n; i++){
printf("%s %s %d %d %d\n", s[i].id, s[i].name, s[i].s1, s[i].s2, s[i].s3);
}
}
}
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
typedef struct{
char id[13], name[21];
int s1, s2, s3;
}stu;
int cmp(const void *a, const void *b){
return strcmp(((stu*)a)->id, ((stu*)b)->id);
}
int main() {
int n;
scanf("%d", &n);
stu s[n+1];
for (int i = 0; i<n; i++){
scanf("%s %s %d %d %d", s[i].id, s[i].name, &s[i].s1, &s[i].s2, &s[i].s3);
}
scanf("%s %s %d %d %d", s[n].id, s[n].name, &s[n].s1, &s[n].s2, &s[n].s3);
int flag = 0;
for (int i = 0; i<n; i++){
if (strcmp(s[i].id, s[n].id) == 0){
flag = 1;
break;
}
}
if (flag){
printf("error!\n");
}
else{
qsort(s, n+1, sizeof(stu), cmp);
for (int i = 0; i<=n; i++){
printf("%s %s %d %d %d\n", s[i].id, s[i].name, s[i].s1, s[i].s2, s[i].s3);
}
}
}
学生信息的那些操作:(6) 删除记录
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下删除功能:输入一个学生的学号,删除该学生的所有信息。
输入样例:
3
202016040201 Zhangling 78 95 55
202016040202 Wangli 87 99 88
202016040203 Fangfang 68 76 75
202016040201
输出样例:
202016040202 Wangli 87 99 88
202016040203 Fangfang 68 76 75
AC代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h>
typedef struct{
char id[13], name[21];
int s1, s2, s3;
}stu;
int main() {
int n;
scanf("%d", &n);
stu s[n+1], ss;
for (int i = 0; i<n; i++){
scanf("%s %s %d %d %d", s[i].id, s[i].name, &s[i].s1, &s[i].s2, &s[i].s3);
}
scanf("%s %s %d %d %d", ss.id, ss.name, &ss.s1, &ss.s2, &ss.s3);
int flag = 0;
for (int i = 0; i<n; i++){
if (strcmp(s[i].id, ss.id) == 0){
flag = i;
break;
}
}
if (flag){
printf("error!\n");
}
else{
for (int i = flag+1; i<n; i++){
s[i-1] = s[i];
}
for (int i = 0; i<n-1; i++){
printf("%s %s %d %d %d\n", s[i].id, s[i].name, s[i].s1, s[i].s2, s[i].s3);
}
}
}
求一组数的平均值并按降序排序
调用Input函数从键盘读入不超过10个学生的成绩,成绩低于0分或者超过100分重新读入,读满10个或者遇到9999结束;调用Average函数求一组数的平均值;调用Sort函数将这组数按照降序排序。
裁判测试程序样例:
#include <stdio.h>
#define N 10
void Input(float *pa,int *n);
float Average(float *pa, int n);
void Sort(float *pa,int n);
int main()
{
float a[N],ave;
float *p = a;
int n;
Input(p, &n);
ave = Average(p, n);
Sort(p,n);
printf("average = %.2f\n",ave);
for(p = a;p<a+n;p++)
printf("%-7.1f",*p);
return 0;
}
/* 请在这里填写答案 */
输入样例1:
59.5 88.5 77 40 95 65 9999
输出样例1:
average = 70.83
95.0 88.5 77.0 65.0 59.5 40.0
AC代码:
void Input(float *pa,int *n){
int num=0;
float x;
scanf("%f", &x);
while (num < 10 && x != 9999){
if (x < 0 || x > 100){
scanf("%f", &x);
continue;
}
else {
pa[num++] = x;
}
scanf("%f", &x);
}
*n = num;
}
float Average(float *pa, int n){
float sum = 0;
for (int i = 0; i<n; i++){
sum += pa[i];
}
return sum/n;
}
void Sort(float *pa,int n){
for (int i = 0; i<n-1; i++){
for (int j = 0; j<n-1-i; j++){
if (pa[j] < pa[j+1]){
float temp = pa[j];
pa[j] = pa[j+1];
pa[j+1] = temp;
}
}
}
}
过滤字符串只保留串中的数字字符
函数的功能是:输入一个字符串,过滤此串,统计串中包含的数字字符个数,逆序输出串中的数字字符。
输入样例:
hjds34jj,&67
输出样例:
There are 4 digits in the string,they are 3467
The number of inversions is 7643
裁判测试程序样例:
#include <stdio.h>
int Count_Digit ( char *ptr,int *num );
int main()
{
char str[80];
int cnt,num;
gets(str);
cnt=Count_Digit(str,&num);
printf("There are %d digits in the string,they are %s\n",cnt,str);
printf("The number of inversions is %d\n",num);
return 0;
}
/* 请在这里填写答案 */
AC代码:
int Count_Digit ( char *ptr,int *num ){
char *s;
int count = 0, sum = 0;
s = ptr;
while (*ptr!='\0'){
if (*ptr >= '0' && *ptr <= '9'){
s[count++] = *ptr;
}
ptr++;
}
s[count] = '\0';
for (int i = count-1; i>=0; i--){
sum = sum*10+s[i]-'0';
}
*num = sum;
ptr = s;
return count;
}
电码加密
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。要求编写并调用函数encrypt (),按要求修改字符串内容。变换规则如下:小写字母z变换成为a,其他字母变换成为该字母ASCII码顺序后一位的字母,比如o变换成为p。
输入样例:
adfz
输出样例:
bega
裁判测试程序样例:
#include <stdio.h>
# include <string.h>
# define MAXLINE 80
void encrypt ( char *s);
int main (void)
{
char line [MAXLINE];
gets(line);
encrypt (line);
printf ("%s\n", line);
return 0;
}
/* 请在这里填写答案 */
AC代码:
void encrypt ( char *s){
for (;*s!='\0'; s++){
if (*s == 'z'){
*s = 'a';
}
else *s = *s+1;
}
}
从键盘读入一串字符后去除首尾字符后的字符串按降序排序
请编写函数Sort函数,将字符串中除首、尾字符外的其余字符按降序排列。
输入样例:
CEAedca
输出样例:
CedcEAa
裁判测试程序样例:
#include <stdio.h>
void Sort(char *p);
int main(void)
{
char str[21] ;
gets(str);
Sort(str);
puts(str);
return 0;
}
/* 请在这里填写答案 */
AC代码:
void Sort(char *p){
int len = strlen(p);
for (int i = 1; i < len - 2; i++) {
for (int j = 1; j < len - 2 - (i - 1); j++) {
if (p[j] < p[j + 1]) {
char temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
每个单词的首字母改为大写
本题要求实现一个函数,将p所指字符串中每个单词的首字母字母改成大写,大写字母及非字母不变化。(这里的“单词”是指由一个或者多个空格隔开的字符串)。
输入样例:
There are 45 students in my class.
输出样例:
After changing: There Are 45 Students In My Class.
裁判测试程序样例:
#include <stdio.h>
void Conv( char *p );
int main()
{
char str[64];
gets(str);
Conv(str);
printf("After changing: %s", str);
return 0;
}
/* 请在这里填写答案 */
AC代码:
void Conv( char *p ){
int num=0;
while (*p!='\0'){
if (*p == ' '){
num = 0;
}
else{
if (num == 0){
if (*p>='a' && *p<='z') *p = *p-32;
}
num++;
}
p++;
}
}
按要求移动字符
函数Move_str的功能是:在字符串str中找到ASCII码值最大的字符,将该字符放到首位,其余字符顺序后移。
输入样例:
ABCDeFGe
输出样例:
The string after moving:eeABCDFG
裁判测试程序样例:
#include<stdio.h>
void Move_str ( char *p);
int main()
{
char str[80];
gets(str);
Move_str(str);
printf("The string after moving:");
puts(str);
return 0;
}
/* 请在这里填写答案 */
AC代码:
void Move_str ( char *p){
char t=p[0];
int pos = 0;
int len = strlen(p);
for (int i = 0; p[i]!='\0'; i++){
if (p[i] > t) {
t = p[i];
pos = i;
}
}
for (int i = pos; i>0; i--){
p[i] = p[i-1];
}
p[0] = t;
for (int i = 1; i<len; i++){
if (p[i] == t){
for (int j=i-1; j>=0; j--){
p[j+1] = p[j];
}
p[0] = t;
}
}
}
查找二维数组中的最大值及其行列下标
程序实现查找二维数组的最大值以及行、列下标,请根据函数 FindMaxbyCol()的声明和调用完成函数的定义。
输入样例:
3 4
3 5 -1 4
7 -32 0 9
-102 45 78 4
输出样例:
78 2 2
裁判测试程序样例:
#include <stdio.h>
int FindMaxbyCol(int *q,int row,int col,int *maxRow,int *maxCcol);
int main(void)
{
int m,n;
scanf("%d%d",&m,&n);
int a[m][n];
int max,maxr,maxc;
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
max=FindMaxbyCol(a[0],m,n,&maxr,&maxc);
printf("%d %d %d\n",max,maxr,maxc);
return 0;
}
/* 请在这里填写答案 */
AC代码:
int FindMaxbyCol(int *q, int row, int col, int *maxRow, int *maxCcol) {
int i, j, max = q[0]; // 初始化最大值为第一个元素
*maxRow = 0;
*maxCcol = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (q[i * col + j] > max) { // 计算二维数组中元素的一维索引
max = q[i * col + j];
*maxRow = i;
*maxCcol = j;
}
}
}
return max;
}