【PTA-C语言】编程练习4 - 数组Ⅱ

7-8 2048游戏模拟(2)–向下移位合并(分数 15)

作者 李民
单位 武汉理工大学

本题模拟2048游戏的规则,提供4X4个格子,输入每个格子的初始值(空白格子值为0),玩家选择向下移动,所有数字向下靠拢,相同的数字相撞时会合并。移动结束后,输出合并后的数值。

输入格式:
分4行,每行输入4个整数,分别表示格子中的初值,数据之间用空格分隔。

输出格式:
分4行,输出移动合并后的数据,每个数之间有一个空格,行末无空格。

输入样例:

2 0 2 2
2 2 4 4
0 2 0 2
4 0 0 4

输出样例:

0 0 0 2
0 0 0 4
4 0 2 2
4 4 4 4

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

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

7-9 二进制数据转换成十进制数(分数 15)

作者 汤练兵
单位 武汉理工大学

输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。

输入格式:
输入1个二进制数串(至少1位且不超过16位)。

输出格式:
输出转换后的十进制数。

输入样例:

0110110001100

输出样例:

3468

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include <stdio.h>
#include <math.h>
int main()
{
    
    
    char a[17];
    gets(a);
    int i, n = strlen(a), k, sum=0;
    for(i=n-1,k=0; i>=0; i--,k++)
        sum += (a[i]-48)*pow(2,k);
    printf("%d", sum);
    return 0;
}

7-10 英文单词排序(分数 15)

作者 张泳
单位 浙大城市学院

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple
#

输出样例:

red blue green yellow purple 

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include<stdio.h>
#include<string.h>
int main(){
    
    
    int i, j, k;
    char a[30][20], temp[20];
    for(i=0;i<20;i++) {
    
    
        gets(a[i]);
        if(a[i][0]=='#')
            break;
    }
    for(k=0;k<i-1;k++)
        for(j=0;j<i-k-1;j++)
            if(strlen(a[j])>strlen(a[j+1])) {
    
    
                strcpy(temp, a[j]);
                strcpy(a[j], a[j+1]);
                strcpy(a[j+1], temp);
            }
    for(j=0;j<i;j++)
        printf("%s ", a[j]);
    return 0;
}

7-11 统计单词的长度(分数 15)

作者 颜晖
单位 浙大城市学院

本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:
输入给出一行字符。

输出格式:
在一行中输出每个单词的长度。每个数字后有一个空格。

输入样例:

How are you?

输出样例:

3 3 4 

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include<stdio.h>
int main()
{
    
    
    int i=0, n=0;
    char b;
    scanf("%c", &b);
    if(b!=' ') n++;
    while(b != '\n') {
    
    
        scanf("%c", &b);
        if(b!=' ' &&b !='\n') n++;
        if(n!=0 && b==' ' || b=='\n') {
    
    
            if(n) {
    
    
                printf("%d ", n);
                i=1;
            }
            n=0;
        }
    }
    if(i!=1)
        printf("0 ");
    return 0;
}

7-12 来验证我们的身份证吧(分数 15)

作者 孙骏
单位 武汉理工大学

咱们的身份证号码由18位字符组成,其中17位为地区、日期编号和顺序编号,最后1位为校验码。

校验码的计算规则如下:

首先求出前17位数字的加权和S,权重分配按顺序为:{ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
然后将计算的和S对11取模得到值Z;
最后按照以下关系对应Z值与校验码M的值:
Z: 0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

例如:对于身份证号420111200001014148,按权重累加和S为:

4×7+2×9+0×10+1×5+…+4×8+1×4+4×2=125

由此计算 Z=S%11=4

对应的M值为 8 ,即校验位值为8,与输入的身份证号最后一位相同,故上述身份证号正确。若M值与身份证最后一位不同,则身份证号有问题。

本题给出一些身份证号码,请你验证校验码是否正确。若身份证号有问题,则输出该号码。

输入格式:
第1行输入需判断的身份证号码条数N(0<N<=10)。从第2行开始,每行输入一条身份证号。

输出格式:
每行输出一条不正确的身份证号。

若全部正确,输出"全部正确!"。

输入样例 1:

3
420106197107251007
310111196602231020
602402200311154723

输出样例 1:

全部正确!

输入样例 2:

2
42010619710725100X
220111196302231027

输出样例 2:

42010619710725100X

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include <stdio.h>
int main(){
    
    
    int sum, Z, n, i, count = 0, j, k, weight[] = {
    
     7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 }, wrong = 0;
    char M[] = {
    
     '1','0','X','9','8','7','6','5','4','3','2' }, id[100][20];
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
    
    
        sum = 0;
        scanf("%s", id[i]);
        for(j = 0; j < 18; j++)
            if(j < 17) {
    
    
                if(id[i][j] >= '0' && id[i][j] <= '9')
                    sum += (id[i][j] - '0') * weight[j];
                else {
    
    
                    wrong = 1;
                    break;
                }
            } else {
    
    
                Z = sum % 11;
                if (id[i][j] != M[Z])
                    wrong = 1;
            }
        if(wrong) {
    
    
            printf("%s\n", id[i]);
            count++;
            wrong = 0;
        }
    }
    if(count == 0) printf("全部正确!\n");
    return 0;
}

7-13 将整数按三位分节(分数 15)

作者 李民
单位 武汉理工大学

编写一个程序,将某个位数不确定的非负整数进行三位分节后输出。程序保证数据是不超过4个字节的正整数。

输入格式:
输入一个非负整数,以回车结束输入。

输出格式:
将这个正整数每隔3位就用逗号分隔,然后输出。

输入样例:

1234567

输出样例:

1,234,567

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include<stdio.h>
#include<string.h>
int main(){
    
    
    char a[1000];
    scanf("%s", a);
    int i, t = strlen(a);
    for(i=0; i<t; i++) {
    
    
        printf("%c", a[i]);
        if((t-i-1)%3==0 && i!=t-1)
            printf(",");
    }
    printf("\n");
    return 0;
}

7-14 求完全对称日(分数 10)

作者 李民
单位 武汉理工大学

刚进入2020年,网上就流传着2020.02.02是“千年一遇”的对称日(正着读反着读都一样),很多情侣准备选择这一天去登记结婚。事实上,像这样的完全对称日还有很多。
现在来编写一个程序,输入2个年份M、N(1000<=M<=N<=9999),输出M和N之间(包含M、N)的所有完全对称日。如果没有完全对称日,则输出"None"。

输入格式:
输入2个年份M、N(1000<=M<=N<=9999)。

输出格式:
按“年.月.日”的格式输出该年所有的完全对称日。其中年按4位输出,月、日均按2位输出,位数不足则加前导0。每行输出一个完全对称日。

输入样例:

2011 2020

输出样例:

2011.11.02
2020.02.02

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include <stdio.h>
int main()
{
    
    
    int y, mm, day, m, n, result=0;
    scanf("%d %d", &m, &n);
    for(y=m;y<=n;y++)
        for(mm=1;mm<=12;mm++) {
    
    
            if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
                for(day=1;day<=31;day++)
                    if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
    
    
                        printf("%d.%02d.%02d\n",y,mm,day);
                        result=1;
                    }
            if(mm==4||mm==6||mm==9||mm==11)
                for(day=1;day<=30;day++)
                    if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
    
    
                        printf("%d.%02d.%02d\n", y, mm, day);
                        result=1;
                    }
            if(mm==2) {
    
    
                if((y%4==0&&y%100!=0)||(y%400==0)) {
    
    
                    for(day=1;day<=29;day++)
                        if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
    
    
                            printf("%d.%02d.%02d\n", y, mm, day);
                            result=1;
                        }
                }
                else
                    for(day=1;day<=28;day++)
                        if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
    
    
                            printf("%d.%02d.%02d\n", y, mm, day);
                            result=1;
                        }
            }
        }
    if(result==0) printf("None");
    return 0;
}

7-15 念数字(分数 10)

作者 翁恺
单位 浙江大学

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式:
输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:

-600

输出样例:

fu liu ling ling

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    char num[20];
    scanf("%s", &num);
    int i, n = strlen(num);
    for(i=0; i<n; i++) {
    
    
        switch(num[i]) {
    
    
            case '-':printf("fu"); break;
            case '0':printf("ling"); break;
            case '1':printf("yi"); break;
            case '2':printf("er"); break;
            case '3':printf("san"); break;
            case '4':printf("si"); break;
            case '5':printf("wu"); break;
            case '6':printf("liu"); break;
            case '7':printf("qi"); break;
            case '8':printf("ba"); break;
            case '9':printf("jiu"); break;
            default: break;
        }
        if(i<n-1) printf(" ");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45801887/article/details/134830275