- 11-6连续的合数
求出不小于n的最小的m个连续的和数。
【输入输出要求】
输入:
正整数n,m
输出:
m个连续自然数,数之间有空格,行末无空格。
【输入输出样例】
输入:
100 10
输出:
114 115 116 117 118 119 120 121 122 123
#include <stdio.h>
int is_prime(int n) // 判断是否为质数
{
if (n <= 1) {
return 0;
}
int i;
for (i = 2; i <= n / 2; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m); // 输入n和m
int i, j, count;
for (i = n; ; i++) { // 从n开始遍历自然数,找到m个合数
count = 0;
for (j = i; j < i + m; j++) { // 判断这m个数是否为合数
if (!is_prime(j)) {
count++;
} else {
break;
}
}
if (count == m) { // 如果这m个数全部为合数,输出并退出循环
for (j = i; j < i + m; j++) {
printf("%d ", j);
}
break;
}
}
return 0;
}
- 11-8密文转明文(字符串)
现有一种加密方式,将明文的第一位, 最后一位, 第二位, 倒数第二位, …按顺序连接。先输入密文,求明文。
【输入输出要求】
输入:
一串字符串
输出:
一串字符串
【输入输出样例】
输入:
H.edlllroo w
输出:
Hello world.
#include <stdio.h>
#include <string.h>
int main() {
char mingwen[100];
char miwen[100];
gets(miwen);
int len = strlen(miwen)-1;
int mid =len/ 2;
int i = 0, j = len ;
while (i <= mid && j > mid) {
mingwen[i]=miwen[i * 2];
mingwen[j]=miwen[(len-j)*2+1] ;
i++;
j--;
}
if (i == j) mingwen[i]=miwen[i * 2];
mingwen[len+1]='\0';
puts(mingwen);
return 0;
}
- 8.10矩阵的最大和四个最小
- /*代码有些问题*/
编写函数,将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放)。
元素的交换只交换最大和中心元素,四个最小和四角元素,其他元素位置不变。假设元素互不相同。
对4个最小元素,先找最小,与a[0][0]交换;然后从a[0][1]开始找次小元素,和a[0][4]交换,再从a[0][1]开始找,过程中跳过a[0][4];第3小也是如此, ......
编写主函数,输入5*5的矩阵,调用函数进行上述变换,在主函数中输出结果。
输入:5行整数,表示5*5矩阵
输出:5行整数,每行中的元素用一个英文空格隔开,末尾无空格。
【输入输出样例】
输入:
31 34 33 32 25
30 29 28 27 26
35 24 23 22 21
20 19 18 17 16
15 14 13 12 11
输出: 【为简化输出,每个数后加一个空格,行尾也是如此】
11 34 33 32 12
30 29 28 27 26
23 24 35 22 21
20 19 18 17 16
13 31 15 25 14
#include <stdio.h>
#define MAX_SIZE 5
// 找到矩阵中最大元素的位置,保存在 row, col 中
int find_max(int a[MAX_SIZE][MAX_SIZE], int *row, int *col) {
int max = a[0][0],i,j;
*row = *col = 0;
for (i = 0; i < MAX_SIZE; i++) {
for (j = 0; j < MAX_SIZE; j++) {
if (a[i][j] > max) {
max = a[i][j];
*row = i;
*col = j;
}
}
}
return max;
}
// 将 a[row1][col1] 和 a[row2][col2] 两个元素交换
void swap(int a[MAX_SIZE][MAX_SIZE], int row1, int col1, int row2, int col2) {
int temp = a[row1][col1];
a[row1][col1] = a[row2][col2];
a[row2][col2] = temp;
}
int main() {
int a[MAX_SIZE][MAX_SIZE];
int i,j,k;
// 输入矩阵
for (i = 0; i < MAX_SIZE; i++) {
for (j = 0; j < MAX_SIZE; j++) {
scanf("%d", &a[i][j]);
}
}
// 找出最大元素并移动到中心
int max_row, max_col;
int max = find_max(a, &max_row, &max_col);
swap(a, max_row, max_col, MAX_SIZE / 2, MAX_SIZE / 2);
// 将四个最小元素移动到四个角上,每次从剩余元素中找出最小的
int min_row, min_col;
for (i = 0; i < 4; i++) {
int min = a[0][0];
min_row = min_col = 0;
for (j = 0; j < MAX_SIZE; j++) {
for (k = 0; k < MAX_SIZE; k++) {
if (a[j][k] < min) {
min = a[j][k];
min_row = j;
min_col = k;
}
}
}
swap(a, min_row, min_col, (i / 2) * (MAX_SIZE - 1), (i % 2) * (MAX_SIZE - 1));
// 上面一行代码等价于下面两行代码:
// if (i == 0) swap(a, min_row, min_col, 0, 0);
// else if (i == 1) swap(a, min_row, min_col, 0, MAX_SIZE - 1);
// else if (i == 2) swap(a, min_row, min_col, MAX_SIZE - 1, 0);
// else swap(a, min_row, min_col, MAX_SIZE - 1, MAX_SIZE - 1);
}
// 输出矩阵
for (i = 0; i < MAX_SIZE; i++) {
for (j = 0; j < MAX_SIZE; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
- 8.7单词排序
编写函数,实现字符串的排序(从小到大),不区分大小写。函数原型为:
void sortstring(char r[][30],int n);
其中r表示字符串二维数组,n表示字符串个数。
// 注意:字符比较 strcmp函数, 交换 strcpy函数
编写主函数,输入n和n个单词,调用函数排序,在主函数中输出排序的单词,每个一行。
提示:定义指针数组,例如(以下仅为示意代码)
char q[100][30];
................
scanf("%s",q[i]); // 读入的字符串
......
sortstring(q,n); // 调用函数
【输入输出样例】
输入:
5
study
student
sting
STRING
STRAY
输出:
sting
STRAY
STRING
student
study
#include <stdio.h>
#include <string.h>
void sortstring(char r[][30], int n);
int main() {
int n,i;
scanf("%d", &n);
char q[100][30];
for (i = 0; i < n; i++) {
scanf("%s", q[i]);
}
sortstring(q, n);
for (i = 0; i < n; i++) {
printf("%s\n", q[i]);
}
return 0;
}
void sortstring(char r[][30], int n) {
char p[100][30];
int i,j;
char temp[30];
for (i = 0; i < n; i++) {
strcpy(p[i],r[i]);
}
for (i = 1; i < n; i++) {
for (j = 0; j < n - i; j++) {
if (strcasecmp(p[j], p[j + 1]) > 0) { // 不区分大小写比较字符串大小
strcpy(temp , p[j]);
strcpy(p[j] , p[j + 1]);
strcpy(p[j + 1] , temp);
}
}
}
for (i = 0; i < n; i++) {
strcpy(r[i], p[i]); // 将排好序的字符复制回原来的数组,完成排序
}
}
- 7.1实现学生信息的录入和输出,要求使用结构体实现。
定义一个描述学生信息的结构体,包含学生学号、姓名、班级、三门课程成绩和总成绩(学号等数据类型的要求同前),用函数实现三个学生信息的录入和按照学生三门课程总成绩排序。在主函数中调用这两个函数,按照学生总成绩从小到大输出各项信息。
程序运行结果如下(输入3个人的信息):
1001
11
zhang
99.5
88.5
89.5
277.5
1002
22
li
77.9
56.5
87.5
221.9
1003
11
wang
92.5
99.0
60.5
252.0
(回车后确认后输出以下结果)
1002,22,li,77.9,56.5,87.5,221.9
1003,11,wang,92.5,99.0,60.5,252.0
1001,11,zhang,99.5,88.5,89.5,277.5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student{
int id;
int class;
char name[20];
double score1, score2, score3;
double total;
};
// 按照总成绩从小到大排序学生信息
void sort(struct Student stu[]) {
int i,j;
struct Student temp;
for (i = 0; i < 2; i++) {
for (j = i + 1; j < 3; j++) {
if (stu[i].total > stu[j].total) {
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
}
int main() {
int i;
struct Student stu[100];
for(i=0;i<3;i++)
{
scanf("%d",&stu[i].id);
scanf("%d",&stu[i].class);
scanf("%s",&stu[i].name);
scanf("%lf",&stu[i].score1);
scanf("%lf",&stu[i].score2);
scanf("%lf",&stu[i].score3);
scanf("%lf",&stu[i].total);
}
sort(stu);
for ( i = 0; i < 3; i++) {
printf("%d,%d,%s,%.1lf,%.1lf,%.1lf,%.1lf\n", stu[i].id, stu[i].class, stu[i].name,
stu[i].score1, stu[i].score2, stu[i].score3, stu[i].total);
}
return 0;
}
- 11-7找勾股数
找出在大于等于m小于等于n的所有没有倍数关系的勾股数组。例如:10,8,6 是 5,4,3的倍数则不显示。
【输入输出要求】
输入:
整数a,b。
输出:
每一行三个数由大到小输出,数之间有空格,末尾无空格。(提示:printf("%d %d %d\n",....))
【输入输出样例】
输入:
3 39
输出:
5 4 3
13 12 5
17 15 8
25 24 7
29 21 20
37 35 12
#include <stdio.h>
int main() {
int m, n,a,b,c;
int flag,k;
scanf("%d %d", &m, &n);
// 枚举 a, b, c,注意 a <= b < c
for ( c = m; c <= n; c++) {
for ( b = m; b < c; b++) { // b 从 m 开始枚举,保证 a < b < c
for ( a = m; a < b; a++) { // a 从 m 开始枚举,保证 a < b < c
if (a * a + b * b == c * c) { // 判断是否为勾股数
flag = 1;
for ( k = 2; k <= a / 2; k++) {
if (a % k == 0 && b % k == 0 && c % k == 0) {
flag = 0; // 如果找到了一个公因数,说明不符合条件
break;
}
}
if (flag) printf("%d %d %d\n", c, b, a); // 如果没找到公因数,则输出勾股数(注意反向输出)
}
}
}
}
return 0;
}