skip to content
everlasting的博客
Table of Contents

C语言作业答案(下)

第六章1

逆序输出输入的整数

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int num [n];
for (int i = 0; i < n; i++) {
scanf("%d", &num [i]);
}
int mask = 1;
for (int j = n - 1; j >= 0; j--) {
if (mask == 1) {
printf("%d", num [j]);
mask = 0;
}else {
printf(" %d", num [j]);
}
}
return 0;
}

统计各大写字母的个数

#include <stdio.h>
int main ()
{
char s[10000];
scanf("%[^\n]", s);
int cnt[26] = {0};
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
cnt[s[i] - 'A']++;
}
}
for (int i = 0; i < 26; i++) {
printf("%c(%d)", 'A' + i, cnt[i]);
if ((i + 1) % 5 == 0) {
printf("\n");
}
}
return 0;
}

输出斐波那契数列的前n项

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int num [n];
for (int i = 0; i < n; i++) {
if (i == 0 || i == 1) {
num [i] = 1;
}else {
num [i] = num [i - 1] + num [i - 2];
}
}
int mask = 1;
for(int j = 0; j < n; j++) {
if (mask % 5 == 0) {
if (mask == n) {
printf("%10d", num [j]);
}else {
printf("%10d\n", num [j]);
mask++;
}
}else {
printf("%10d", num [j]);
mask++;
}
}
return 0;
}

约瑟夫问题

#include <stdio.h>
int main()
{
int n, m, s;
scanf("%d %d %d", &n, &m, &s);
int num[n + 1];
num[0] = 0;
for (int i = 1; i <= n; i++) {
num[i] = i;
}
int i = s;
int t = n;
while (t > 0) {
int cnt = 0;
while (cnt < m) {
if (num[i] != 0) {
cnt++;
}
if (cnt < m) {
i++;
if (i > n) {
i = 1;
}
}
}
printf("%3d", num[i]);
num[i] = 0;
t--;
do {
i++;
if (i > n) {
i = 1;
}
}while (num[i] == 0 && t > 0);
}
return 0;
}

奇数阶幻方问题

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int s[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
s[i][j] = 0;
}
}
int i = 0;
int j = (n - 1) / 2;
for (int k = 1; k <= n * n; k++) {
s[i][j] = k;
int I = i;
int J = j;
i -= 1;
j += 1;
if (i < 0) {
i = n - 1;
}
if (j > n - 1) {
j = 0;
}
if (s[i][j] != 0) {
i = I + 1;
j = J;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", s[i][j]);
if (j == n - 1) {
printf("\n");
}
}
}
return 0;
}

统计学生的总分以及各课程的平均分

#include <stdio.h>
int main ()
{
int n, m;
scanf("%d %d", &n, &m);
char name[n][100];
int grade[n][m];
int sum[n];
for (int i = 0; i < n; i++) {
sum[i] = 0;
}
for (int i = 0; i < n; i++) {
scanf("%s", name[i]);
for (int j = 0; j < m; j++) {
scanf("%d", &grade[i][j]);
sum[i] += grade[i][j];
}
}
for (int i = 0; i < n; i++) {
printf("%-8s", name[i]);
printf("%6d", sum[i]);
for (int j = 0; j < m; j++) {
printf("%6d", grade[i][j]);
}
printf("\n");
}
double aver[m];
for (int i = 0; i < m; i++) {
aver[i] = 0;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
aver[i] += grade[j][i];
}
aver[i] /= n;
}
printf("average score:");
for (int i = 0; i < m; i++) {
printf("%6.1f", aver[i]);
}
return 0;
}

统计学生成绩的最高最低分以及超过平均分的人数

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int grade[n];
double aver = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &grade[i]);
aver += grade[i];
}
aver /= n;
int cnt = 0;
for (int i = 0; i < n; i++) {
if (grade[i] > aver) {
cnt++;
}
}
int min = grade[0];
for (int i = 1; i < n; i++) {
if (grade[i] < min) {
min = grade[i];
}
}
int max = grade[0];
for (int i = 1; i < n; i++) {
if (grade[i] > max) {
max = grade[i];
}
}
printf("%d %d %d", max, min, cnt);
return 0;
}

进制转换

#include <stdio.h>
int main ()
{
char str[100];
int num = 0;
int i = 0;
char c;
while ((c = getchar()) != '#') {
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
str[i++] = c;
num *= 16;
if (c >= '0' && c <= '9') {
num += c - '0';
}else if (c >= 'A' && c <= 'F') {
num += c - 'A' + 10;
}else if (c >= 'a' && c <= 'f') {
num += c - 'a' + 10;
}
}
}
str[i] = '\0';
printf("String:%s\n", str);
printf("number=%d", num);
return 0;
}

求最大字符串

#include <stdio.h>
#include <string.h>
int main ()
{
int n;
scanf("%d", &n);
getchar();
char str[n][100];
for (int i = 0; i < n; i++) {
gets(str[i]);
}
int maxI = 0;
for (int i = 1; i < n; i++) {
if (strcmp(str[i], str[maxI]) > 0) {
maxI = i;
}
}
printf("%s", str[maxI]);
return 0;
}

字符串首尾相连

#include <stdio.h>
int main() {
char str1[101],str2[101];
int i,j;
gets(str1);
gets(str2);
// Here is your code
i = 0;
while (str1[i] != '\0' && str1[i] != '\n') {
i++;
}
str1[i] = '\0';
j = 0;
while (str2[j] != '\0' && str2[j] != '\n') {
j++;
}
str2[j] = '\0';
for (int k = 0; k < j; k++) {
str1[i] = str2[k];
i++;
}
str1[i] = '\0';
puts(str1);
return 0;
}

统计各数字出现的次数

#include <stdio.h>
int main ()
{
char c;
int num[10] = {0};
while (c != '!'){
scanf("%c", &c);
if (c >= '0' && c <= '9') {
num[c - '0']++;
}
}
for (int i = 0; i < 10; i++) {
if (i == 9) {
printf("The character %d appears %d times", i, num[i]);
}else {
printf("The character %d appears %d times\n", i, num[i]);
}
}
return 0;
}

找出二维数组中的最小元素

#include <stdio.h>
int main ()
{
int m, n;
scanf("%d %d", &m, &n);
int a[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
printf("before:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("after:\n");
int min =a[0][0];
int I = 0;
int J = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] < min) {
min = a[i][j];
I = i;
J = j;
}
}
}
for (int j = 0; j < n; j++) {
int t = a[m - 1][j];
a[m - 1][j] = a[I][j];
a[I][j] = t;
}
int mask = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", a[i][j]);
}
if (i != m - 1) {
printf("\n");
}
}
return 0;
}

矩阵转置

#include <stdio.h>
int main ()
{
int n, m;
scanf("%d %d", &n, &m);
int a[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j == m - 1) {
printf("%d", a[i][j]);
}else {
printf("%d ", a[i][j]);
}
}
printf("\n");
}
int b[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
b[i][j] = a[j][i];
if (j == n - 1) {
printf("%d", b[i][j]);
}else {
printf("%d ", b[i][j]);
}
}
printf("\n");
}
return 0;
}

二分查找

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int num[n];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
int res;
scanf("%d", &res);
int a = 0;
int b = n - 1;
int mask = 0;
while (a <= b) {
int mid = a + (b - a) / 2;
if (num[mid] == res) {
printf("%d", mid);
mask = 1;
break;
}else if (num[mid] < res) {
a = mid + 1;
}else {
b = mid - 1;
}
}
if (mask == 0) {
printf("Not found");
}
return 0;
}

冒泡排序

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int num[100];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (num[j] > num[j + 1]) {
int t = num[j];
num[j] = num[j + 1];
num[j + 1] = t;
}
}
}
for (int i = 0; i < n; i++) {
printf("%d", num[i]);
if (i != n - 1) {
printf(" ");
}
}
return 0;
}

第六章2

大写改小写

#include <stdio.h>
int main ()
{
char ch;
while (scanf("%c", &ch) != EOF && ch != '\n') {
if (ch >= 'A' && ch <= 'Z') {
ch += 32;
}
putchar(ch);
}
return 0;
}

串比较

#include <stdio.h>
int main ()
{
char str1[101];
gets(str1);
char str2[101];
gets(str2);
int i = 0;
while (str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]) {
i++;
}
printf("%d", str1[i] - str2[i]);
return 0;
}

串复制

#include <stdio.h>
int main() {
char str1[101],str2[101];
int i;
gets(str1);
// Please fill this blank
for (i = 0; str1[i] != '\0'; i++) {
str2[i] = str1[i];
}
str2[i] = '\0';
puts(str2);
return 0;
}

逆向输出字符串

#include <stdio.h>
int main ()
{
char str1[101],str2[101];
int i,j;
gets(str1);
// Please fill this blank
int l = 0;
while (str1[l] != '\0') {
l++;
}
for (i = 0, j = l - 1; j >= 0; i++, j--) {
str2[i] = str1[j];
}
str2[l] = '\0';
puts(str2);
return 0;
}

对方阵做统计处理

#include <stdio.h>
void Traverse(int n, int s[n][n])
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &s[i][j]);
}
}
}
int sumD(int n, int s[n][n])
{
int sum = 0;
for (int i = 0; i < n; i++) {
sum += s[i][i];
}
for (int i = 0; i < n; i++) {
sum += s[n - 1 - i][i];
}
if (n % 2 != 0) {
sum -= s[(n - 1) / 2][(n - 1) / 2];
}
return sum;
}
int multiple(int n, int s[n][n])
{
int m = 1;
for (int i = 0; i < n; i += 2) {
m *= s[i][i];
}
for (int j = 0; j < n; j += 2) {
if ((n - 1 - j) % 2 == 0) {
m *= s[n - 1 - j][j];
}
}
return m;
}
int main ()
{
int n;
scanf("%d", &n);
int s[n][n];
Traverse(n, s);
printf("%d %d\n", sumD(n, s), multiple(n,s));
int p[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
p[j][n - 1 - i] = s[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d", p[i][j]);
if (j < n - 1) {
printf(" ");
}
}
if (i < n - 1) {
printf("\n");
}
}
return 0;
}

兔子和狐狸

#include <stdio.h>
int main ()
{
int n, m;
scanf("%d %d", &n, &m);
int h[n + 1];
for (int i = 0; i <= n; i++) {
h[i] = 1;
}
h[0] = 0;
h[1] = 0;
int i = 2;
int j = 1;
int s = 1;
while (s <= m * n) {
j += i;
s += i;
i++;
if (s > m * n) {
break;
}
if (j > n) {
j %= n;
if (j == 0) {
j = n;
}
}
h[j] = 0;
}
int mask = 1;
for (int i = 0; i <= n; i++) {
if (h[i] == 1) {
if (mask == 1) {
printf("%d", i);
mask = 0;
}else {
printf(" %d", i);
}
}
}
if (mask == 1) {
printf("No choice");
}
return 0;
}

删除字符串中指定字符

#include <stdio.h>
int main ()
{
char str[101];
gets(str);
char ch;
scanf("%c", &ch);
int j = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] != ch) {
str[j++] = str[i];
}
}
str[j] = '\0';
printf("%s", str);
return 0;
}

奇偶数分开排序

#include <stdio.h>
void sorting (int num[], int n)
{
for (int i = n - 1; i > 0; i--) {
int tag = i;
for (int j = i - 1; j >= 0; j--) {
if (num[tag] < num[j]) {
tag = j;
}
}
int t = num[i];
num[i] = num[tag];
num[tag] = t;
}
}
void print (int num[], int n)
{
int mask = 1;
for (int i = 0; i < n; i++) {
if (mask == 1) {
printf("%d", num[i]);
mask = 0;
}else {
printf(" %d", num[i]);
}
}
}
int main ()
{
int n;
scanf("%d", &n);
int num[n];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
int odd[n];
int even[n];
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < n; i++) {
if (num[i] % 2 == 1) {
odd[cnt1] = num[i];
cnt1++;
}else {
even[cnt2] = num[i];
cnt2++;
}
}
sorting(odd, cnt1);
sorting(even, cnt2);
print(odd, cnt1);
printf(" ");
print(even, cnt2);
return 0;
}

选择排序

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int num[n];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
for (int i = n - 1; i > 0; i--) {
int tag = i;
for (int j = i - 1; j >= 0; j--) {
if (num[tag] < num[j]) {
tag = j;
}
}
int t = num[i];
num[i] = num[tag];
num[tag] = t;
}
for (int i = 0; i < n; i++) {
printf("%d ", num[i]);
}
return 0;
}

杨辉三角形

#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int a[31][31] = {0};
// 构造杨辉三角
for (int i = 0; i < n; i++) {
a[i][0] = a[i][i] = 1;
for (int j = 1; j < i; j++) {
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%10d", a[i][j]);
}
printf("\n");
}
return 0;
}

在有序数组中插入一个数

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int num[n + 1];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
int m;
scanf("%d", &m);
num[n] = m;
for (int i = n - 1; i >= 0; i--) {
if (num[i] > num[i + 1]) {
int t = num[i + 1];
num[i + 1] = num [i];
num[i] = t;
}else {
break;
}
}
int mask = 1;
for (int i = 0; i <= n; i++) {
if (mask == 1) {
printf("%d", num[i]);
mask = 0;
}else {
printf(" %d", num[i]);
}
}
return 0;
}

筛法求素数

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int Prime[n + 1];
for (int i = 2; i <= n; i++) {
Prime[i] = 1;
}
for (int i = 2; i <= n; i++) {
if (Prime[i] == 1) {
for (int k = i * i; k <= n; k += i) {
Prime[k] = 0;
}
}
}
int mask = 1;
for (int i = 2; i <= n; i++) {
if (Prime[i] != 0) {
if (mask == 1) {
printf("%d", i);
mask = 0;
}else {
printf(" %d", i);
}
}
}
return 0;
}

最长对称子串

#include <stdio.h>
int main ()
{
char s[1001];
gets(s);
int length_I = 1;
for (int i = 1; s[i] != '\0'; i++) {
int length_i = 1;
for (int j = 1; s[i + j] == s[i - j] && i - j >= 0; j++) {
length_i += 2;
}
if (length_i > length_I) {
length_I = length_i;
}
}
int length_J = 0;
for (int i = 0; s[i] != '\0'; i++) {
int length_j = 0;
for (int j = 1; s[i + 1 - j] == s[i + j] && i + 1 - j >= 0; j++) {
length_j += 2;
}
if (length_j > length_J) {
length_J = length_j;
}
}
if (length_J > length_I) {
printf("%d", length_J);
}else {
printf("%d", length_I);
}
return 0;
}

装睡的人

#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
char name[4];
int breath, pulse;
for (int i = 0; i < N; i++) {
scanf("%s %d %d", name, &breath, &pulse);
if (breath < 15 || breath > 20 || pulse < 50 || pulse > 70) {
printf("%s\n", name);
}
}
return 0;
}

第六章3

个位数统计

#include <stdio.h>
#include <string.h>
int main() {
char N[1005];
int count[10] = {0};
scanf("%s", N);
for (int i = 0; i < strlen(N); i++) {
int d = N[i] - '0';
count[d]++;
}
for (int d = 0; d <= 9; d++) {
if (count[d] > 0) {
printf("%d:%d\n", d, count[d]);
}
}
return 0;
}

找出不是两个数组共有的元素

#include <stdio.h>
void find(int m, int n, int a[m], int b[n], int s[42])
{
int cnt = 0;
for (int i = 0; i < m; i++) {
int mask = 0;
for (int j = 0; j < n; j++) {
if (a[i] == b[j]) {
mask = 1;
break;
}
}
if (mask == 0) {
s[cnt++] = a[i];
}
}
for (int i = 0; i < n; i++) {
int mask = 0;
for (int j = 0; j < m; j++) {
if (b[i] == a[j]) {
mask = 1;
break;
}
}
if (mask == 0) {
s[cnt++] = b[i];
}
}
}
void printing (int a[42])
{
int s[42];
for (int i = 0; i < 42; i++) {
s[i] = -1;
}
for (int i = 0; i < 42 && a[i] != -1; i++) {
if (s[i] == -1) {
printf("%d ", a[i]);
for (int j = i; j < 42 && a[j] != -1; j++) {
if (a[j] == a[i]) {
s[j] = 0;
}
}
}
}
}
int main ()
{
int n;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int m;
scanf("%d", &m);
int b[m];
for (int i = 0; i < m; i++) {
scanf("%d", &b[i]);
}
int s[42];
for (int i = 0; i < 42; i++) {
s[i] = -1;
}
find(n, m, a, b, s);
printing(s);
return 0;
}

字符串逆序

#include <stdio.h>
#include <string.h>
int main ()
{
char a[81];
fgets(a, sizeof(a), stdin);
int length = strlen(a);
int j = length - 1;
int i = 0;
while (i < j) {
char b = a[i];
a[i] = a[j];
a[j] = b;
i++;
j--;
}
printf("%s", a);
return 0;
}

找鞍点

#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int a[6][6];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
for (int i = 0; i < n; i++) {
int rowMax = a[i][0];
for (int j = 1; j < n; j++) {
if (a[i][j] > rowMax) {
rowMax = a[i][j];
}
}
for (int j = 0; j < n; j++) {
if (a[i][j] == rowMax) {
int colMin = a[0][j];
for (int k = 1; k < n; k++) {
if (a[k][j] < colMin) {
colMin = a[k][j];
}
}
if (a[i][j] == colMin) {
printf("%d %d\n", i, j);
return 0;
}
}
}
}
printf("NONE\n");
return 0;
}

求n以内最大的k个素数以及它们的和

#include <stdio.h>
void findPrime (int n, int Prime[])
{
for (int i = 2; i <= n; i++) {
Prime[i] = 1;
}
for (int i = 2; i * i <= n; i++) {
if (Prime[i] == 1) {
for (int k = i * i; k <= n; k += i) {
Prime[k] = 0;
}
}
}
Prime[0] = 0;
Prime[1] = 0;
}
int main ()
{
int max, cnt;
scanf("%d %d", &max, &cnt);
int isPrime[10001];
findPrime(max, isPrime);
int sum = 0;
int mask = 0;
for (int i = max; i > 0 && mask < cnt; i--) {
if (isPrime[i] == 1) {
sum += i;
if (mask == 0) {
printf("%d", i);
}else {
printf("+%d", i);
}
mask++;
}
}
printf("=%d", sum);
return 0;
}

1234方阵

#include <stdio.h>
void printing (int n, int s[n][n])
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d", s[i][j]);
if (j < n - 1) {
printf(" ");
}
}
printf("\n");
}
}
int main ()
{
int n;
scanf("%d", &n);
int s[n][n];
for (int i = 0; i < n; i++) {
s[i][i] = 0;
}
for (int i = 0; i < n; i++) {
s[n - 1 - i][i] = 0;
}
int cnt = n - 2;
int k = cnt;
int l = cnt;
int J = 1;
for (int i = 0; k > 0; i++) {
l = k;
int j = J;
while (l > 0) {
s[i][j] = 1;
l--;
j++;
}
k -= 2;
J += 1;
}
cnt = n - 2;
k = cnt;
l = cnt;
int I = 1;
for (int j = 0; k > 0; j++) {
l = k;
int i = I;
while (l > 0) {
s[i][j] = 2;
l--;
i++;
}
k -= 2;
I += 1;
}
cnt = n - 2;
k = cnt;
l = cnt;
J = 1;
for (int i = n - 1; k > 0; i--) {
l = k;
int j = J;
while (l > 0) {
s[i][j] = 3;
l--;
j++;
}
k -= 2;
J += 1;
}
cnt = n - 2;
k = cnt;
l = cnt;
I = 1;
for (int j = n - 1; k > 0; j--) {
l = k;
int i = I;
while (l > 0) {
s[i][j] = 4;
l--;
i++;
}
k -= 2;
I += 1;
}
printing(n, s);
return 0;
}

心情查询

#include <stdio.h>
void Traverse1 (int n, int s[n])
{
for (int i = 0; i < n; i++) {
scanf("%d", &s[i]);
}
}
void initialize_Traverse2 (int n, int s[n])
{
for (int i = 0; i < n; i++) {
s[i] = -1;
}
int i = 0;
int j;
while (i < n - 1 && scanf("%d", &j) == 1) {
if (j < 0 || j > 23) {
break;
}else {
s[i++] = j;
}
}
}
int main ()
{
const int n = 24;
int s[n];
Traverse1(n, s);
int hour[n + 1];
initialize_Traverse2(n + 1, hour);
int i = 0;
while (i < n + 1 && hour[i] != -1) {
if (s[hour[i]] > 50) {
printf("%d Yes", s[hour[i]]);
}else if (s[hour[i]] <= 50) {
printf("%d No", s[hour[i]]);
}
if (s[hour[i + 1]] != -1) {
printf("\n");
}else {
break;
}
i++;
}
return 0;
}

点赞

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int q[1001] = {0};
for (int i = 0; i < n; i++) {
int p;
scanf("%d", &p);
for (int j = 0; j < p; j++) {
int k;
scanf("%d", &k);
q[k]++;
}
}
int max = 1000;
for (int i = 1000; i >= 0; i--) {
if (q[i] > q[max]) {
max = i;
}
}
printf("%d %d", max, q[max]);
return 0;
}

古风排版

#include <stdio.h>
int ceiling (double num)
{
int i = (int)num;
if (num > i) {
return i + 1;
}
return i;
}
int main ()
{
int n;
scanf("%d", &n);
getchar();
char s[1001];
gets(s);
int len = 0;
while (s[len] != '\0') {
len++;
}
s[len] = '\0';
int column = ceiling((double)len / n);
char c[n][column];
int k = 0;
for (int j = column - 1; j >= 0; j--) {
for (int i = 0; i < n; i++) {
if (k < len) {
c[i][j] = s[k++];
} else {
c[i][j] = ' ';
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < column; j++) {
printf("%c", c[i][j]);
}
printf("\n");
}
return 0;
}

字符串A-B

#include <stdio.h>
int main ()
{
char a[10001];
gets(a);
char b[10001];
gets(b);
int c[10001] = {0};
int k = 0;
for (int i = 0; a[i] != '\0'; i++) {
for (int j = 0; b[j] != '\0'; j++) {
if (b[j] == a[i] ) {
c[k++] = i;
break;
}
}
}
for (int i = 0; a[i] != '\0'; i++) {
int mask = 1;
for (int j = 0; j < k; j++) {
if (i == c[j]) {
mask = 0;
break;
}
}
if (mask == 1) {
printf("%c", a[i]);
}
}
return 0;
}

n个数字都不相同的年份

#include <stdio.h>
void initialize_years(int year, int years[4])
{
for (int i = 0; i < 4; i++) {
years[i] = 0;
}
int i = 3;
while (year > 0 && i >= 0) {
years[i] = year % 10;
year /= 10;
i--;
}
}
int main ()
{
int y;
scanf("%d", &y);
int s[4];
initialize_years(y, s);
int n;
scanf("%d", &n);
int cnt = 0;
while (1) {
int mask = 1;
int num[10] = {0};
for (int i = 0; i < 4; i++) {
int j = 0;
for ( ; j < 10; ) {
if (s[i] == j) {
num[j]++;
break;
}else {
j++;
}
}
}
for (int k = 0; k < 10; k++) {
if (n == 4) {
if (num[k] != 0 && num[k] != 1) {
mask = 0;
break;
}
}else if (n == 3) {
int cnt = 0;
for (int l = 0; l < 10; l++) {
if (num[l] == 2) {
cnt++;
}
}
if (cnt != 1) {
mask = 0;
break;
}
}else if (n == 2) {
int tag = 0;
for (int l = 0; l < 10; l++)
if (num[l] == 0) {
tag++;
}
if (tag != 8) {
mask = 0;
break;
}
}
}
if (mask == 0) {
y += 1;
cnt++;
initialize_years(y, s);
}else {
break;
}
}
printf("%d ", cnt);
for (int i = 0; i < 4; i++) {
printf("%d", s[i]);
}
return 0;
}

矩阵A乘以B

#include <stdio.h>
int main() {
int Ra, Ca, Rb, Cb;
int A[100][100], B[100][100], C[100][100];
scanf("%d %d", &Ra, &Ca);
for (int i = 0; i < Ra; i++) {
for (int j = 0; j < Ca; j++) {
scanf("%d", &A[i][j]);
}
}
scanf("%d %d", &Rb, &Cb);
for (int i = 0; i < Rb; i++) {
for (int j = 0; j < Cb; j++) {
scanf("%d", &B[i][j]);
}
}
if (Ca != Rb) {
printf("Error: %d != %d\n", Ca, Rb);
return 0;
}
for (int i = 0; i < Ra; i++) {
for (int j = 0; j < Cb; j++) {
C[i][j] = 0;
for (int k = 0; k < Ca; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
printf("%d %d\n", Ra, Cb);
for (int i = 0; i < Ra; i++) {
for (int j = 0; j < Cb; j++) {
if (j > 0) printf(" ");
printf("%d", C[i][j]);
}
printf("\n");
}
return 0;
}

查验身份证

#include <stdio.h>
int main ()
{
int s[17];
int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int i = 0;
int sum = 0;
while (i < 17 && scanf("%1d", &s[i]) == 1) {
sum += s[i] *a[i];
i++;
}
char b;
scanf("%c", &b);
sum %= 11;
int z[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
char m[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
char mask = '0';
for (int i = 0; i < 11; i++) {
if (sum == z[i]) {
mask = m[i];
}
}
if (mask == b) {
printf("No problem");
}else {
printf("Incorrect");
}
return 0;
}

判断题的评判

#include <stdio.h>
int main ()
{
int n;
scanf("%d", &n);
int AC[n];
for (int i = 0; i < n; i++) {
scanf("%d", &AC[i]);
}
int WA[n];
int cnt = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &WA[i]);
if (WA[i] == AC[i]) {
cnt++;
}
}
double x;
x = 1.0 * cnt / n;
printf("%.2f%%", x * 100);
return 0;
}

数组元素循环右移问题

#include <stdio.h>
void reverse(int a[], int l, int r) {
while (l < r) {
int t = a[l];
a[l] = a[r];
a[r] = t;
l++;
r--;
}
}
int main ()
{
int n, m;
scanf("%d %d", &n, &m);
m %= n;
int s[n];
for (int i = n - 1; i >= 0; i--) {
scanf("%d", &s[i]);
}
reverse(s, 0, m - 1);
reverse(s, m, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", s[i]);
}
return 0;
}

第七章

定义print函数,输出n个*

void print(int k)
{
for (int i = 1; i <= k; i++)
printf("*");
printf("\n");
}

定义函数求π的近似值

double funpi(double e)
{
double flag = 1, sum = 0;
for (int i = 1;; i++)
{
double t = flag / (2 * i - 1);
if (t < 0)
{
if (-t < e)
break;
}
else
{
if (t < e)
break;
}
sum += t; //求和
flag = -flag; //正负反转
}
return sum;
}

设计函数计算并输出矩形的面积

void area(int a, int b)
{
printf("%d", a * b);
}

定义函数prime,判定正整数n是否素数

#include <math.h>
int prime(int n)
{
for (int i = 2; i <= sqrt(n); i++)
if (n % i == 0)
return 0;
return 1;
}

设计函数实现冒泡排序

void sort(int a[], int n)
{
for (int i = 0; i < n - 1; i++) //一趟冒泡排序,把最小的数字放在最末尾
{
for (int j = 0; j < n - i - 1; j++) //每经过一趟冒泡排序,需要检索的数字个数-1
{
if (a[j] < a[j + 1]) //如果左边的数字小于右边的数字,实现相邻两个数的交换
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
void print(int a[], int n)
{
for (int i = 0; i < n; i++)
{
if (i == 0)
printf("%d", a[i]);
else
printf(" %d", a[i]);
}
printf("\n");
}

设计函数实现矩阵的转置

void convert(int arr1[][10], int arr2[][10], int x, int y)
{
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
arr2[j][i] = arr1[i][j]; // 矩阵行列坐标互换
}
void print(int arr[][10], int x, int y) //二维数组的行可以不初始化,列一定要初始化
{
for (int i = 0; i < x; i++) //控制行数
{
for (int j = 0; j < y; j++) //控制列数
{
if (j == 0)
printf("%d", arr[i][j]);
else
printf(" %d", arr[i][j]);
}
printf("\n");
}
}

设计函数实现二分查找

int BinSearch(int a[], int n, int x)
{
int left = 0; //数组最左侧元素下标
int right = n - 1; //数组最右侧元素下标
while (left <= right)
{
//int mid = (right + left) / 2;
int mid = left + (right - left) / 2; //防止数据过大,越界
if (x < a[mid])
left = mid + 1;
else if (x > a[mid])
right = mid - 1;
else
return mid;
}
return -1;
}

定义menu函数,输出菜单选项

void Menu()
{
printf(" Menu\n");
printf(" (1)--读取数据\n");
printf(" (2)--数据计算\n");
printf(" (3)--查找数据\n");
printf(" (4)--输出数据\n");
printf(" (0)--退出程序\n");
}

设计函数计算学生的平均成绩

double average(int a[], int n)
{
double sum = 0;
for (int i = 0; i < n; i++)
sum = sum += a[i];
return sum / n;
}

设计递归函数模拟汉诺塔游戏

void move(int n, char a, char b, char c)
{
if (n == 1)
printf("%c-->%c\n", a, c); //当只有一个盘子时,直接从起始柱移到目标柱
else
{
move(n - 1, a, c, b); //第一步:将n-1个盘子由a移动到b,注意此时起始柱是a,中转柱是c,目标柱是b;
printf("%c-->%c\n", a, c); //第二步:将第n个盘子从起始柱移到目标柱
move(n - 1, b, a, c); //第三步:将n-1个盘子由b移动到c,注意此时起始柱是b,中转柱是a,目标柱是c;
}
}

设计递归函数计算Fibonacci数列的第n项

int fib(int n)
{
if (n <= 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}

设计递归函数计算组合

int fun(int m, int n)
{
if (n == 0 || n == m) //c(0,m)和c(m,m)都为1(特判)
return 1;
else
return fun(m - 1, n - 1) + fun(m - 1, n); //组合数公式 c(n,m)=c(n-1,m-1)+c(n-1,m) m>=n
}

设计递归函数计算两个整数的最大公约数

int gcd(int m, int n) //辗转相除法
{
if (n == 0)
return m;
else
return gcd(n, m % n);
}

设计递归函数计算n!

int fac(int n)
{
if (n <= 1)
return 1;
else
return n * fac(n - 1);
}

设计max函数,计算三个整数的最大值

int max(int a, int b, int c)
{
if (a >= b && a >= c)
return a;
if (b >= a && b >= c)
return b;
if (c >= a && c >= b)
return c;
}