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;
}


相关文章
|
10月前
|
C++
18字符串处理函数
18字符串处理函数
34 0
|
4月前
|
安全
字符串处理
String类: String是一个不可变类,一旦创建就不能修改。 String greeting = "Hello"; greeting = greeting + " World!"; System.out.println(greeting); // 输出: Hello World! StringBuilder和StringBuffer: 这两个类用于可变字符串操作,StringBuilder在单线程环境下使用,而StringBuffer是线程安全的。 StringBuilder sb = new StringBuilder("Hello"); sb
|
4月前
c常用 字符串处理函数
字符串处理函数 puts()将一个字符串输出到终端 gets()从终端输入一个字符串到字符数组,并且得到一个函数值。 strcat()链接两个字符数组中的字符串。 strcpy()字符串复制函数。 strcmp()比较字符串作用。 strlen()测试字符串长度的函数不包括“\0” strlwr()将字符串中的大写字母转换为小写字母。 strupr()将字符串中的小写字母转换为大写字母。
77 7
|
9月前
字符串\字符串处理常用函数
字符串\字符串处理常用函数
61 2
|
10月前
|
索引 Python
使用字符串处理函数的文章
在编程中,字符串处理是一项常见的任务,涉及到对文本数据的各种操作,如查找、替换、分割、连接等。为了简化这些操作,许多编程语言都提供了一系列的字符串处理函数。本文将介绍一些常用的字符串处理函数,并附上相应的代码示例。
40 0
|
10月前
字符串处理
字符串处理
C/C++字符串处理函数
C/C++字符串处理函数
106 1
字符串处理函数总结
使用字符串处理函数 注意:在使用后字符串处理函数时,应当在程序文件的开头用
97 0
|
存储 测试技术 数据安全/隐私保护
PAT乙级 (字符串处理) 1006、1021、1031、1002、1009、1014、1024、1048(二)
PAT乙级 (字符串处理) 1006、1021、1031、1002、1009、1014、1024、1048
72 0
|
Shell 编译器 iOS开发
字符串处理函数1
一、字符数组 二、字符串处理函数