Contest100000569 – 《算法笔记》2.5小节——C/C++快速入门->数组

发布于 2020-01-20  193 次阅读


Problem A: 习题6-4 有序插入

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 3559 Solved: 2146
Description
有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。

Input
第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。
第二行输入一个整数

Output
从小到大输出这10个数,每个数一行。
Sample Input
1 11 21 31 41 51 61 71 81
45
Sample Output
1
11
21
31
41
45
51
61
71
81
HINT
定义数组时,把数组长度定义为10.

代码(C语言)


\#include <stdio.h> #include <string.h> int main() { int a[10]; memset(a, 0, sizeof(a)); //初始化数组,使数组中每个元素为0 for (int i = 0; i <= 8; i++) { scanf("%d", &a[i]); } int t; scanf("%d", &t); //输入最后一个元素 int M; //第十个元素t所在位置 for (int i = 0; i <= 8; i++) { if (a[i] >= t) { M = i; //找到比t大的元素 break; } } for (int i = 9; i > M; i--) { a[i] = a[i - 1]; } //先给t让个位置 a[M] = t; for (int i = 0; i <= 9; i++) { printf("%d\n", a[i]); } return 0; }

Problem B: 习题6-5 数组元素逆置

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 2434 Solved: 1971
Description
将一个长度为10的整型数组中的值按逆序重新存放。
如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1

Input
从键盘上输入以空格分隔的10个整数。
Output
按相反的顺序输出这10个数,每个数占一行。
Sample Input
1 2 3 4 5 6 7 8 9 0
Sample Output

0
9
8
7
6
5
4
3
2
1

代码(C语言)
代码1(有错,但是不知错在哪)

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

代码2


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

Problem C: 习题6-6 杨辉三角

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 2781 Solved: 1917
Description
按要求输入如下格式的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多输出10层

杨辉三角的原理:
每一行的下一行的最左侧a的指数都比上一行要多1而b的指数不变。

Input
输入只包含一个正整数n,表示将要输出的杨辉三角的层数。
Output
对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开
Sample Input
5
Sample Output
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

代码(C语言)


\#include <stdio.h> #include <string.h> int main() { int a[10][10]; memset(a, 0, sizeof(a)); int n; //层数 scanf("%d", &n); a[0][0] = 1; for (int i = 1; i < n; i++) { for (int j = 1; j <= i; j++) { a[i][ 0] = 1; 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("%d ", a[i][j]); } printf("\n"); } return 0; }

Problem D: 习题6-12 解密

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 2716 Solved: 1779
Description
有一行电文,已按如下规律译成密码:
A-->Z a-->z
B-->Y b-->y
C-->X c-->x
...... ......
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

Input
输入一行密文
Output
解密后的原文,单独占一行。
Sample Input
ZYX123zyx
Sample Output
ABC123abc

代码(C语言)

#include<stdio.h>
#include<string.h>
int main(){
    char a[20];
    scanf("%s",a);
    int n = strlen(a);
    for(int i = 0; i < n; i++){
        if (a[i] >= 'A' && a[i] <= 'Z'){
            a[i] = 'A' + 'Z' - a[i];
        }else if (a[i] >='a' && a[i] <= 'z'){
            a[i] = 'a' + 'z' - a[i];
        }else{
            a[i] = a[i];
        }
    }
    for (int i = 0; i < n; i++){
        printf("%c", a[i]);
    }
    printf("\n");
    return 0;
}

Problem E: 习题6-13 字符串比较

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 2424 Solved: 1698
Description
比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。
要求:不用strcpy函数;两个字符串用gets函数读入。
例如:"A"与"C"相比,由于"A"<"C",应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。
同理:"And"和"Aid"比较,根据第2个字符比较的结果,"n"比"i"大5,因此应该输出"5"

Input
输入2行字符串
Output
一个整数,表示这两个字符串 比较的差值,单独占一行。
Sample Input

And
Aid

Sample Output
5

代码(C语言)
代码1

#include<stdio.h>
#include<string.h>
int main(){
    char s1[200],s2[200];
    int sum = 0;
    gets(s1);
    gets(s2);
    for(int i = 0; i < strlen(s1); i++){
        sum += s1[i] - s2[i];
    }
    printf("%d",sum);
    printf("\n");
    return 0;
}

代码2

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[100], s2[100];
    scanf("%s", s1);
    scanf("%s", s2);
    int n1 = strlen(s1);
    int n2 = strlen(s2);
    int sum1 = 0;
    int sum2 = 0;
    for (int i = 0; i < n1; i++)
    {
        sum1 = sum1 + s1[i];
    }
    for (int i = 0; i < n2; i++)
    {
        sum2 = sum2 + s2[i];
    }
    if (sum1 == sum2)
    {
        printf("0");
    }
    else
        printf("%d\n", sum1 - sum2);
    return 0;
}

Problem F: 例题6-1 逆序输出数组元素

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 1831 Solved: 1452
Description
从键盘上输入10个整数,存储在一个长度为10的整型数组中,要求将输入的10个数逆序输出。
如输入为:0,1,2,3,4,5,6,7,8,9 输出为9,8,7,6,5,4,3,2,1,0

Input
10个整数,以空格分隔
Output
将输入的10个整数逆序输出,每个数占一行。
Sample Input
0 1 2 3 4 5 6 7 8 9
Sample Output
9
8
7
6
5
4
3
2
1
0

代码(C语言)

#include<stdio.h>
int main(){
    int a[10];
    memset(a,0,sizeof(a));
    for(int i = 0; i < 10; i++){
        scanf("%d",&a[i]);
    }
    for(int i = 9; i >= 0; i--){
        printf("%d",a[i]);
        printf("\n");
    }
    printf("\n");
    return 0;
}

Problem G: 例题6-2 数组求解Fibonacci数列问题

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 1778 Solved: 1571
Description
Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
要求输出Fibonacci数列的前20个数。

Input

Output
Fibonacci数列的前20个数,每个数占一行。
Sample Input

Sample Output

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

代码(C语言)

#include<stdio.h>
int main(){
    int fibon[20];
    fibon[0] = 1;
    fibon[1] = 1;
    printf("%d",fibon[0]);
    printf("\n");
    printf("%d",fibon[1]);
    printf("\n");
    for(int i = 2; i < 20; i++){
        fibon[i] = fibon[i-1] + fibon[i-2];
        printf("%d",fibon[i]);
        printf("\n");
    }
    printf("\n");
    return 0;
}

Problem H: 例题6-3 冒泡排序

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 2723 Solved: 1681
Description
从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。
Input
以空格分隔的10个整数
Output
依次输出排好序的10个整数,每个数占一行。
Sample Input
1 3 5 7 9 2 4 6 8 0
Sample Output

0
1
2
3
4
5
6
7
8
9

代码(C语言)

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

疑问:中间排序for循环的体中为什么是j不是i?(已解决)

Problem I: 例题6-4 矩阵转置

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 1939 Solved: 1578
Description
将一个2行3列的矩阵(二维数组)行列互换,存储到另一个3行2列的矩阵中。
要求以整型数据为例来解答。

Input
输入2行数据,每行3个整数,以空格分隔。
Output
行列互换后的矩阵,3行,每行2个数据,以空格分隔。
Sample Input
1 2 3
4 5 6
Sample Output
1 4
2 5
3 6

代码(C语言)
代码1

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

注意:两个元素之间有空格,scanf的&取地址符号要有。

代码2

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

Problem J: 例题6-9 字符串求最大值

Time Limit: 1 Sec Memory Limit: 12 MB
Submit: 2372 Solved: 1612
Description
从键盘上输入3个字符串,求出其中最大者。

Input
输入3行,每行均为一个字符串。
Output
一行,输入三个字符串中最大者。
Sample Input

England
China
America

Sample Output
England

代码(C语言)

#include<stdio.h>
#include<string.h>
int main(){
    char a[50],b[50],c[50];
    scanf("%s",a);
    scanf("%s",b);
    scanf("%s",c);
    int d = 0,e =0,f = 0;
    for(int i = 0; i < strlen(a); i++){
        d += a[i];
    }
    for(int i = 0; i < strlen(b); i++){
        e += b[i];
    }
    for(int i = 0; i < strlen(c); i++){
        f += c[i];
    }
    if (d > e)
    {
        if (d > f) printf("%s",a);
        else printf("%s",c);
    }
    else
    {
        if (e > f) printf("%s",b);
        else printf("%s",c);
    }
    return 0;
}

注意:d,e,f需要初始化,仅仅定义会出现Wrong Answer(50)。

本文标题:《Contest100000569 – 《算法笔记》2.5小节——C/C++快速入门->数组》

本文链接:https://wnag.com.cn/195.html

特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~


正因为有要好好实现的梦想,所以今天也要好好加油。