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