xdoj 大一上期末c语言复习小结

发布时间:2024年01月08日

来源于公开的c语言期末沙龙,侵删。

? ? ?题目类型? ? ? ? ? ? ? ? ? ?注意事项
?? ?单循环+计算? ? ? ? ? ? ? 保留精度
?? ?循环+一维数组? ? ? ? ? 数组定义、索引
?? ?二维数组/字符串? ? ? ? 矩阵、结束标志
?? ?函数? ? ? ? ? ? ? ? ? ? ? ? ???片段、函数头
?? ?综合? ? ? ? ? ? ? ? ? ? ? ? ? ?结构体、排序

掌握的基本算法

1.排序
2.最大公约数,最小公倍数
3.闰年,素数(质数),完全平方数
4.回文数,水仙花数,等差数列,中间数
5.乘法表,矩阵旋转,矩阵相乘、转置、对角线
6.字符串逆序、拷贝、拼接、插入、删除等
7.获取整数的每一位,或由位数构造新数
8.角谷定理,马鞍点

?代码不一定正确,可以说是一种思路

1.冒泡排序法

int i=0,j=0;(机试系统用c89,所以需要提前定义
?? ?for(i=0;i<n;i++)
?? ?{
?? ??? ?for(j=0;j<n-1-i;j++)
?? ??? ?{
?? ??? ??? ?if(a[j]>a[j+1])
?? ??? ??? ?{
?? ??? ??? ??? ?int t=a[j];
?? ??? ??? ??? ?a[j]=a[j+1];
?? ??? ??? ??? ?a[j+1]=t;
?? ??? ??? ?}
?? ??? ?}
?? ?}

2.最大公约数,最小公倍数

?? ?int a, b, temp;
?? ?scanf("%d %d", &a, &b);
?? ?while (b != 0) {
?? ??? ?temp = a % b;
?? ??? ?a = b;
?? ??? ?b = temp;
?? ?}
?? ?printf("%d", a);

辗转相除法,得到的a即为最大公约数,最小公倍数即是两数乘积除去最大公约数;

3.闰年,素数,完全平方数

闰年

if(y%4==0&&y%100!=0||y%400==0)。

素数(一种简单思路)

?? ?int x = 0;
?? ?for (x = 2; x < 100; x++) {
?? ??? ?int i;
?? ??? ?int isPrime = 1;

?? ??? ?for (i = 2; i < x; i++) {
?? ??? ??? ?if (x % i == 0) {
?? ??? ??? ??? ?isPrime = 0;
?? ??? ??? ??? ?//?? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if (isPrime ==1) {
?? ??? ??? ?printf("%d", x);
?? ??? ?}
?? ?}

完全平方数

?? ?int n = 0;
?? ?scanf("%d", &n);
?? ?int i = 0;

?? ?for (i = 1; i < n; i++) {
?? ??? ?int flag = 0;
?? ??? ?if (n == i * i) {
?? ??? ??? ?flag = 1;
?? ??? ?}
?? ??? ?if (flag) {
?? ??? ??? ?printf("%d是完全平方数", n);
?? ??? ??? ?break;
?? ??? ?}?
?? ?}

4.回文数,水仙花数,等差数列,中间数

回文数

int huiwen(int n) {
?? ?int a[10];
?? ?int j = 0;
?? ?while (n > 0) {
?? ??? ?a[j] = n % 10;
?? ??? ?n /= 10;
?? ??? ?j++;
?? ?}
?? ?for (int i = 0; i < j / 2; i++) {
?? ??? ?if (a[i] != a[j - 1 - i]) {
?? ??? ??? ?return 0;

?? ??? ?}
?? ?}
?? ?return 1;
}

int qiuhe(int n) {
?? ?int sum = 0;
?? ?while (n > 0) {
?? ??? ?sum += n % 10;
?? ??? ?n /= 10;
?? ?}
?? ?return sum;
}

int main() {
?? ?int n = 0;
?? ?scanf("%d", &n);
?? ?if (huiwen(n)) {
?? ??? ?printf("%d", qiuhe(n));
?? ?} else {
?? ??? ?printf("no");
?? ?}
?? ?return 0;
}

水仙花数

n是三位数的情况下;

?? ?int n=0;
?? ?scanf("%d",&n);
?? ?int t=n;
?? ?int s1=n%10;
?? ?n/=10;
?? ?int s2=n%10;
?? ?n/=10;
?? ?int s3=n%10;
?? ?if(n==s1*s1*s1+s2*s2*s2+s3*s3*s3)
?? ?{
?? ??? ?printf("%d是水仙花数",n);
?? ?}

等差数列

int a[100];
? ? int n=0;
? ? scanf("%d",&n);
? ? int i=0;
? ? int flag=1;
? ? for(i=0;i<n;i++)
? ? {
? ? ?? ?scanf("%d",&a[i]);
?? ?}
? ? for(i=2;i<n;i++)
? ? {
? ? ? ? if((a[i-1]-a[i-2])!=(a[i]-a[i-1]))
? ? ? ? {
? ? ? ? ?? ?flag=0;
?? ??? ?}
?? ?}
?? ?if(flag=1)
?? ?{
?? ??? ?printf("这个数列是等差数列");
?? ?}

中间数

? ? int n;
?? ?int a[1000];
?? ?int temp = -1;
?? ?int count1 = 0, count2 = 0;
?? ?scanf("%d", &n);
?? ?for (int i = 0; i < n; i++) {
?? ??? ?scanf("%d", &a[i]);
?? ?}
?? ?for (int i = 0; i < n; i++) {
?? ??? ?for (int j = 0; j < n; j++) {
?? ??? ??? ?if (a[i] < a[j]) {
?? ??? ??? ??? ?count1++;
?? ??? ??? ?} else if (a[i] > a[j]) {
?? ??? ??? ??? ?count2++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if (count1 == count2) {
?? ??? ??? ?temp = a[i];
?? ??? ??? ?break;
?? ??? ?}
?? ?}

?? ?printf("%d", temp);

5.乘法表,矩阵旋转,矩阵相乘、转置、对角线

乘法表(二维矩阵双循环)

int i=0,j=0;
for(i=1;i<=9;i++)
{
?? ?for(j=1;j<=9;j++)
?? ?{
?? ??? ?printf("%d*%d=%d",i,j,i*j);
?? ?}
}

矩阵旋转(输出)

?? ?int n = 0, m = 0;
?? ?scanf("%d %d", &n, &m);
?? ?int a[100][100] = {0};
?? ?int i = 0, j = 0;
?? ?for (i = 0; i < n; i++) {
?? ??? ?for (j = 0; j < m; j++) {
?? ??? ??? ?scanf("%d", &a[i][j]);
?? ??? ?}
?? ?}
?? ?for (i = 0; i < m; i++) {
?? ??? ?for (j = n - 1; j >= 0; j--) {
?? ??? ??? ?printf("%d ", a[j][i]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}

矩阵相乘

?? ?int i = 0, j = 0;
?? ?int a[2][3] = {0};
?? ?int b[3][2] = {0};
?? ?for (i = 0; i < 2; i++) {
?? ??? ?for (j = 0; j < 3; j++) {
?? ??? ??? ?scanf("%d", &a[i][j]);
?? ??? ?}
?? ?}
?? ?for (j = 0; j < 3; j++) {
?? ??? ?for (i = 0; i < 2; i++) {
?? ??? ??? ?scanf("%d", &b[j][i]);
?? ??? ?}
?? ?}
?? ?int c[2][2];
?? ?c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0];
?? ?c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1];
?? ?c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0];
?? ?c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1];
?? ?for (i = 0; i < 2; i++) {
?? ??? ?for (j = 0; j < 2; j++) {
?? ??? ??? ?printf("%d ", c[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}

转置

#include <stdio.h>

int main() {
?? ?int n = 0, m = 0;
?? ?int a[10][10] = {0};
?? ?int i = 0, j = 0;
?? ?scanf("%d %d", &n, &m);
?? ?for (i = 0; i < n; i++) {
?? ??? ?for (j = 0; j < m; j++) {
?? ??? ??? ?scanf("%d", &a[i][j]);
?? ??? ?}
?? ?}
?? ?for (j = 0; j < m; j++) {
?? ??? ?for (i = 0; i < n; i++) {
?? ??? ??? ?printf("%d ", a[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?? ?return 0;
}

矩阵对角线

?? ?int n;
?? ?scanf("%d", &n);
?? ?int a[20][20];
?? ?int i = 0;
?? ?int j = 0;
?? ?for (i = 0; i < n; i++) {
?? ??? ?for (j = 0; j < n; j++) {
?? ??? ??? ?scanf("%d", &a[i][j]);
?? ??? ?}
?? ?}
?? ?int sum[42] = {0};
?? ?for (i = 0; i < n; i++) {
?? ??? ?sum[0] += a[i][i];
?? ?}
?? ?for (i = 0; i < n; i++) {
?? ??? ?sum[1] += a[i][n - 1 - i];
?? ?}
?? ?int k = 2;
?? ?for (i = 0; i < n; i++) {
?? ??? ?for (j = 0; j < n; j++) {
?? ??? ??? ?sum[k] += a[i][j];
?? ??? ?}
?? ??? ?k++;
?? ?}
?? ?for (i = 0; i < n; i++) {
?? ??? ?for (j = 0; j < n; j++) {
?? ??? ??? ?sum[k] += a[j][i];
?? ??? ?}
?? ??? ?k++;
?? ?}
?? ?int t = 0;
?? ?for (i = 0; i < 2 * n + 2; i++) {
?? ??? ?for (j = 0; j < 2 * n + 1 - i; j++) {
?? ??? ??? ?if (sum[j] < sum[j + 1]) {
?? ??? ??? ??? ?t = sum[j];
?? ??? ??? ??? ?sum[j] = sum[j + 1];
?? ??? ??? ??? ?sum[j + 1] = t;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?for (i = 0; i < 2 * n + 2; i++) {
?? ??? ?printf("%d ", sum[i]);
?? ?}
?? ?return 0;

??6.字符串逆序、拷贝、拼接、插入、删除等

字符串逆序

?? ?char a[100] = {0};
?? ?gets(a);
?? ?for (int i = strlen(a) - 1; i >= 0; i--) {
?? ??? ?printf("%c", a[i]);

?? ?}

字符串拷贝

strcpy(s1,s);

字符串拼接

strcat(s1,s2);

字符串插入

?? ?char str1[20];
?? ?char str2[20];
?? ?gets(str1);
?? ?gets(str2);
?? ?int n = 0;
?? ?scanf("%d", &n);
?? ?char str[40];
?? ?int len1 = strlen(str1);
?? ?int len2 = strlen(str2);
?? ?int i = 0;
?? ?int k = 0;
?? ?for (i = 0; i < n; i++) {
?? ??? ?str[i] = str1[i];
?? ??? ?k = i;
?? ?}
?? ?int j = 0;
?? ?for (i = n; i < len2 + n; i++) {
?? ??? ?str[i] = str2[j];
?? ??? ?j++;
?? ?}
?? ?k += 1;
?? ?for (i = len2 + n; i < len2 + len1; i++) {

?? ??? ?str[i] = str1[k];
?? ??? ?k++;

?? ?}
?? ?puts(str);

字符串删除

for(i=0;i<len;i++)
{
?? ?if(s[i]=='目标字符')
?? ?{
?? ??? ?continue
?? ?}else
?? ?{
?? ??? ?s1[j]=s[i];
?? ??? ?j++
?? ?}
}

7.获取每一位数,并由其构造新数

eg 构造倒序和降序;

int a[7] = {0};
?? ?int n = 0;
?? ?scanf("%d", &n);
?? ?int t = 0;
?? ?int i = 0;
?? ?for (i = 0; n > 0; i++) {
?? ??? ?a[i] = n % 10;
?? ??? ?n /= 10;
?? ??? ?t++;
?? ?}
?? ?int n1 = 0;
?? ?for (i = 0; i < t; i++) {
?? ??? ?n1 = a[i] + n1 * 10;
?? ?}
?? ?int j = 0;
?? ?int k = 0;
?? ?for (i = 0; i < t; i++) {
?? ??? ?for (j = 0; j < t - 1 - i; j++) {
?? ??? ??? ?if (a[j] < a[j + 1]) {
?? ??? ??? ??? ?k = a[j];
?? ??? ??? ??? ?a[j] = a[j + 1];
?? ??? ??? ??? ?a[j + 1] = k;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?int n2 = 0;
?? ?for (i = 0; i < t; i++) {
?? ??? ?n2 = a[i] + n2 * 10;
?? ?}

8.角谷定理,马鞍点

角谷定理? ?

?int n, count = 0;
?? ?scanf("%d", &n);
?? ?while (n != 1) {
?? ??? ?if (n % 2 == 0) {
?? ??? ??? ?n /= 2;
?? ??? ?} else if (n % 2 == 1) {
?? ??? ??? ?n = 3 * n + 1;
?? ??? ?}
?? ??? ?count++;

?? ?}
?? ?printf("%d", count);

马鞍点

int m = 0, n = 0;
?? ?scanf("%d %d", &m, &n);
?? ?int a[100][100] = {0};
?? ?int i = 0, j = 0;
?? ?for (i = 0; i < m; i++) {
?? ??? ?for (j = 0; j < n; j++) {
?? ??? ??? ?scanf("%d", &a[i][j]);
?? ??? ?}
?? ?}
?? ?int min[100];
?? ?int max[100];
?? ?for (i = 0; i < m; i++) {
?? ??? ?min[i] = a[i][0];
?? ??? ?for (j = 0; j < n; j++) {
?? ??? ??? ?if (a[i][j] < min[i]) {
?? ??? ??? ??? ?min[i] = a[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?for (j = 0; j < n; j++) {
?? ??? ?max[j] = a[0][j];
?? ??? ?for (i = 0; i < m; i++) {
?? ??? ??? ?if (a[i][j] > max[j]) {
?? ??? ??? ??? ?max[j] = a[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?int flag = 1;
?? ?for (i = 0; i < m; i++) {
?? ??? ?for (j = 0; j < n; j++) {
?? ??? ??? ?if (a[i][j] == max[j] && a[i][j] == min[i]) {
?? ??? ??? ??? ?printf("%d %d %d\n", i, j, a[i][j]);
?? ??? ??? ??? ?flag = 0;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?if (flag == 1) {
?? ??? ?printf("No!");
?? ?}

文章来源:https://blog.csdn.net/waychenille/article/details/135432382
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。