PAT乙级 (字符串处理) 1006、1021、1031、1002、1009、1014、1024、1048(一)

简介: PAT乙级 (字符串处理) 1006、1021、1031、1002、1009、1014、1024、1048

1006 换个格式输出整数

让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。

输入格式:

每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。

输出格式:

每个测试用例的输出占一行,用规定的格式输出 n。

输入样例 1:

234

输出样例 1:

BBSSS1234

输入样例 2:

23

输入样例 2:

SS123

代码:

#include<stdio.h>
int main(){
    int num, i, digit1, digit2;
    scanf("%d", &num);
    digit1 = num % 10;//得到个位数
    num /= 10;
    digit2 = num % 10;//得到十位数
    num /= 10;//得到百位数
    for(i = 0; i < num; i ++){//打印百位
        printf("B");
    }
    for(i = 0; i < digit2; i++){//打印十位
        printf("S");
    }
    for(i = 1; i < digit1 + 1; i++){//打印个位
        printf("%d", i);
    }
    return 0;
}

1021 个位数统计

给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

代码:

#include<stdio.h>
#include<string.h>
int main(){
    char str[1010];//将整数转换为字符串
    gets(str);//存储字符串
    int len = strlen(str);//得到字符串长度
    int temp;//记录当前扫描到的字符数字
    int count[10] = {0};//申明一个整型数组,用于存放每个数字出现的次数
    for (int i = 0; i < len; i++){//遍历字符串
        //当前扫描到的字符减去'0'字符的ASCII码,得到的就是当前扫描字符的数字形式
        temp = str[i] - '0';
        count[temp]++;//数组中将扫描到的数字的次数+1
    }
    for (int i = 0; i < 10; i++){//遍历数组
        if(count[i] != 0){//如果当前扫描到的元素不为0则输出
            printf("%d:%d\n", i, count[i]);
        }
    }
    return 0;
}

1031 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对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

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输入样例2:

2
320124198808240056
110108196711301862

输出样例2:

All passed

代码:

(1)

#include<stdio.h>
#include<string.h>
typedef struct {//定义一个存放字符数组的结构体
    char idnum[20];
}infor;
infor person[101];//将该结构体申明为一个数组
int indentify(int a, char b) {//判断取模后跟第18位,即最后一位,是否匹配
    if (a == 0 && b == '1') {
        return 1;
    }
    else if (a == 1 && b == '0') {
        return 1;
    }
    else if (a == 2 && b == 'X') {
        return 1;
    }
    else if (a == 3 && b == '9') {
        return 1;
    }
    else if (a == 4 && b == '8') {
        return 1;
    }
    else if (a == 5 && b == '7') {
        return 1;
    }
    else if (a == 6 && b == '6') {
        return 1;
    }
    else if (a == 7 && b == '5') {
        return 1;
    }
    else if (a == 8 && b == '4') {
        return 1;
    }
    else if (a == 9 && b == '3') {
        return 1;
    }
    else if (a == 10 && b == '2') {
        return 1;
    }
    else {
        return 0;
    }
}
int main() {
    int count, invalid = 0;//count为人数,invalid为不合法的人数
    int temp = 0;
    char num1[20];//用于暂时存放数组,因为第十八位为x,是字母,所以存放在字符数组
    scanf("%d", &count);
    int num2[20] = { 0 };
    int j = 0;
    for (int i = 0; i < count; i++) {
        scanf("%s", &num1);//循环输入身份证
        temp = 0;
        for (j = 0; j <= 17; j++) {//将身份证的前十七位存放在整数型数组中
            num2[j] = num1[j] - '0';
        }
        //得到加权乘法后的总数
        temp = 7 * num2[0] + 9 * num2[1] + 10 * num2[2] + 5 * num2[3] + 8 * num2[4] + 4 * num2[5] + 2 * num2[6] + num2[7] + 6 * num2[8];
        temp += 3 * num2[9] + 7 * num2[10] + 9 * num2[11] + 10 * num2[12] + 5 * num2[13] + 8 * num2[14] + 4 * num2[15] + 2 * num2[16];
        temp %= 11;//得到总数取模11后的结果
        //如果取模后的结果不与要求的第18位相等,则存入结构体数组中
        //并且不合法的人数加一,用当前的不合法人数作为结构体数组下标
        if (indentify(temp, num1[17]) != 1) {
            strcpy(person[invalid].idnum, num1);
            invalid++;
        }
    }
    if (invalid == 0) {//如果不合法人数为0,输出All passed
        printf("All passed");
    }
    else {//如果不合法人数不为0,则按下标顺序逐一输出身份证号
        for (int i = 0; i < invalid; i++) {
            printf("%s\n", person[i].idnum);
        }
    }
    return 0;
}

(2)优化版

#include<stdio.h>
#include<string.h>
#include<stdbool.h>
//权重
int w[20] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//校验码
char change[15] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int main(){
    int person;//人数
    scanf("%d", &person);
    bool flag = true;//记录是否所有的分甚至都是正确的,如果全部正确,则flag = true
    char idnum[20];
    for (int i = 0; i < person; i++){
        scanf("%s", idnum);
        int j, last = 0;//last记录前17位加权和
        for (j = 0; j < 17; j++){
            if ((idnum[j] >= '0' && idnum[j] <= '9') != 1){//如果当前的字符不在数字0-9的ASCII码范围内
                break;//跳出当前循环
            }
            last = last + (idnum[j] - '0') * w[j];//各位加权得到加权和
        }
        if (j < 17){//判断循环是正常执行还是通过break跳出
            flag = false;//通过break跳出,则说明字符串中有非数字,flag改为false
            printf("%s\n", idnum);//输出该不合法的身份证号
        }else{
            if (change[last % 11] != idnum[17]){//循环正常执行,则判断取模后的数字是否与第18位字符相等
                flag = false;//不相等改为false
                printf("%s\n", idnum);//输出该身份证
            }
        }
    }
    if (flag == true){//没有不合法的身份证
        printf("All passed\n");
    }
    return 0;
}

1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

代码:

(1)

#include<stdio.h>
int transferNum(char* a, int* b) {//将字符数组型数字转化为整数数组型数字
    int i;
    for (i = 0; i < 110; i++) {
        if (a[i] == '\0') {//如果当前扫描的字符为终止符,则跳出循环
            break;
        }
        else {
            b[i] = a[i] - '0';
        }
    }
    return i;//返回有多少位数字
}
int printfChinese(int a) {//判断当前扫描到的数字的中文读音,并且输出
    if (a == 0) {
        printf("ling");
    }
    else if (a == 1) {
        printf("yi");
    }
    else if (a == 2) {
        printf("er");
    }
    else if (a == 3) {
        printf("san");
    }
    else if (a == 4) {
        printf("si");
    }
    else if (a == 5) {
        printf("wu");
    }
    else if (a == 6) {
        printf("liu");
    }
    else if (a == 7) {
        printf("qi");
    }
    else if (a == 8) {
        printf("ba");
    }
    else if (a == 9) {
        printf("jiu");
    }
    return 0;
}
int main() {
    char num1[110];//用于存放数字
    int num2[110] = { 0 }, sum = 0, count, res[20];//num2存放数字,sum存放总和,count存放位数,res存放每位的结果
    scanf("%s", num1);
    count = transferNum(num1, num2);//得到数字共有几位
    for (int i = 0; i < count; i++) {//遍历数组,得到总数
        sum += num2[i];
    }
    for (count = 0; sum > 0; count++) {//得到总数每一位的数字,倒序
        res[count] = sum % 10;
        sum /= 10;
    }
    for (count--; count > 0; count--){//输出每位读音
        printfChinese(res[count]);
        printf(" ");
    }
    printfChinese(res[count]);//PAT特色输出
    return 0;
}

(2)

#include<stdio.h>
#include<string.h>
int main() {
  char str[110];
  gets(str);
  int len = strlen(str);
  int sum = 0;//用于存放所用数位之和
  for (int i = 0; i < len; i++) {
    sum += str[i] - '0';//将每一位累加
  }
  int num = 0, ans[10];//num表示sum的位数
  while (sum != 0) {
    //将sum中每一位存到数组中,sum的低位存到ans[]的低位
    ans[num] = sum % 10;
    num++;
    sum /= 10;
  }
  //定义二维数组,即change[0] = "ling",change[1] = "yi"……
  char change[10][5] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
  for (int i = num - 1; i >= 0; i--) {
    printf("%s", change[ans[i]]);
    if (i != 0) {
      printf(" ");
    }
    else {
      printf("\n");
    }
  }
  return 0;
}


相关文章
|
5月前
|
存储 安全 Java
初学者对C语言的爱恨情仇之神秘的字符串
初学者对C语言的爱恨情仇之神秘的字符串
56 0
|
数据采集 人工智能 自然语言处理
“大蟒蛇”的养殖教程---“字符串”
“大蟒蛇”的养殖教程---“字符串”
165 0
|
4月前
|
程序员
老程序员分享:LOJ10155数字转换
老程序员分享:LOJ10155数字转换
19 0
|
5月前
|
对象存储 C++ 索引
C++ 字符串操作的技术性探讨
C++ 字符串操作的技术性探讨
19 1
|
5月前
|
存储 Java
第十四届蓝桥杯集训——字符串函数(基础函数操作)
第十四届蓝桥杯集训——字符串函数(基础函数操作)
55 0
|
11月前
|
存储 编译器 Linux
【C语言航路】第四站:数组(上)
【C语言航路】第四站:数组
66 1
|
11月前
|
存储 编译器 程序员
【C语言航路】第四站:数组(下)
【C语言航路】第四站:数组
74 0
|
数据采集 存储 数据挖掘
【每周一坑】罗马数字转换
由图可知,螺旋数组中的数字运动方向依次 右 -> 下 -> 左 -> 上 -> 右 这样的循环,在合适的条件下变换累加方向即可。
|
存储 索引 Python
三岁学python基础 组合数据类型
三岁学python基础 组合数据类型
99 0
三岁学python基础 组合数据类型
|
存储 算法 C语言
【维生素C语言】第四章 - 数组(一)
本章将对C语言的数组进行讲解,从一维数组开始讲起。已经学了三个章节了,所以本章还附加了三子棋和扫雷两个简单的小游戏,读者可以试着写一写,增加编程兴趣,提高模块化编程思想。
75 0
【维生素C语言】第四章 - 数组(一)