首页 > 试题广场 >

简单密码

[编程题]简单密码
  • 热度指数:286903 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
现在有一种密码变换算法。
九键手机键盘上的数字与字母的对应: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9.
而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。
数字和其它的符号都不做变换。
数据范围: 输入的字符串长度满足

输入描述:

输入一组密码,长度不超过100个字符。



输出描述:

输出密码变换后的字符串

示例1

输入

YUANzhi1987

输出

zvbo9441987
//有相关注释可看
#include <stdio.h>
#include <ctype.h>
#include <string.h>

/* 小写字母处理 */
char lower_letter_proc(char letter) {
    if (letter == 'a' || letter == 'b' || letter == 'c')
        return '2';
    else if (letter == 'd' || letter == 'e' || letter == 'f')
        return '3';
    else if (letter == 'g' || letter == 'h' || letter == 'i')
        return '4';
    else if (letter == 'j' || letter == 'k' || letter == 'l')
        return '5';
    else if (letter == 'm' || letter == 'n' || letter == 'o')
        return '6';
    else if (letter == 'p' || letter == 'q' || letter == 'r' || letter == 's')
        return '7';
    else if (letter == 't' || letter == 'u' || letter == 'v')
        return '8';
    else if (letter == 'w' || letter == 'x' || letter == 'y' || letter == 'z')
        return '9';
    else
        return -1;
}

/* 大写字母处理,大写变小写且是该字母的后一个字母 */
char upper_letter_proc(char letter) {
    char ch =  tolower(letter);
    if (ch == 'z') {
        return 'a';
    }
    else {
        return ch + 1;
    }
}

/*
 * @brief: 密码加密
 * @param: pwd[]——密码数组
 * @retval: none
*/
void proc(char pwd[]) {
    int len = strlen(pwd);
    if (len < 1 || len > 100) {
        perror("pwd length not enough!\n");
        return;
    }
    for (int i = 0; i < len; i++) {
        /*
         数字和其它的符号都不做变换。
         1、是数字,不动。
         2、不是字母 “与” 是符号,不动。
        */
        if ( isdigit(pwd[i]) || (!(isalpha(pwd[i])) && (isgraph(pwd[i]))) ) {
            //do nothing
            continue;
        }

        if (islower(pwd[i])) {
            pwd[i]  = lower_letter_proc(pwd[i]);
        }

        if (isupper(pwd[i])) {
            pwd[i] = upper_letter_proc(pwd[i]);
        }
    }
}

int main() {
    char pwd[101] = "\0";

    fgets(pwd, sizeof(pwd), stdin);
    pwd[strcspn(pwd, "\n")] = '\0';

    proc(pwd);

    printf("%s\n", pwd);

    return 0;
}


编辑于 2024-04-09 13:59:53 回复(0)
#include <ctype.h>
#include <stdio.h>
char low(char a){
    int b = a-'a';
    if(b<3) return '2';
    else if(b<6) return '3';
    else if(b<9) return '4';
    else if(b<12) return '5';
    else if(b<15) return '6';
    else if(b<19) return '7';
    else if(b<22) return '8';
    else if(b<26) return '9';
    return 'F';
}

int main() {
    char s[100] = {'\0'};
    gets(s);
    for(int i; s[i] != '\0'; i++){
        if(islower(s[i])) s[i] = low(s[i]);
        if(isupper(s[i])) {
            if(s[i] == 'Z')s[i] += 7;
            else s[i] += 33;
        }
    }
    printf("%s",s);
    return 0;
}

编辑于 2023-12-02 15:47:21 回复(0)
题目乍一看,好像优点复杂。实际没那么严重,别被吓到。
读题之后,可以看出要分情况讨论,所幸情况也很少。
思路:
(1)题目描述的输入字符串,看本题情况,可以用多次读字符的方式,读一个处理一个,输出一个。
(2) 分情况下,对于A-Z之间的情况,太容易处理了。
对于a-z之间的情况,可以预先定义一个用于查表得字符表,使用字符指针数组即可。
使用for循环+ strchr进行查表,得到字符所在字符指针对应得index里,做个2得偏移,再注意这里要的是数字字符,而不是整型值,使用’0‘来加即可。
#include <stdio.h>
#include <string.h>
int main() {
    int i;
    char a;
    char *table[8] = {"abc","def", "ghi","jkl","mno","pqrs","tuv","wxyz"};
    while(scanf("%c", &a) != EOF)
    {
        if (a >= 'a' && a <= 'z')
        {
            for(i = 0; i < 8; i++)
            {
                if(strchr(table[i], a))
                    a = '0' + i + 2;
            }
        }
        else if(a >= 'A' && a <= 'Z')
        {
            a = a + 32 + 1;
        }
        printf("%c",a);

    }
    printf("\n");
    return 0;
}


发表于 2023-11-25 19:05:44 回复(0)
#include <stdio.h>
#include <string.h>

char fun(char c)//小写字母转换
{
    char t;
    if(c>='a'&&c<='c')
        t= '2';
    if(c>='d'&&c<='f')
        t= '3';
    if(c>='g'&&c<='i')
        t= '4';
    if(c>='j'&&c<='l')
        t= '5';
    if(c>='m'&&c<='o')
        t= '6';
    if(c>='p'&&c<='s')
        t= '7';
    if(c>='t'&&c<='v')
        t= '8';
    if(c>='w'&&c<='z')
        t= '9';
    return t;
}
int main() {
    char str[101]={0};
    gets(str);
    int len=strlen(str);
    for(int i=0; i<len;i++)
    {
        if(str[i]>='a'&&str[i]<='z')
            str[i]=fun(str[i]);
        else if(str[i]>='A'&&str[i]<='Z')
        {
            if(str[i]!='Z')
            {
                str[i]=(char)(str[i]+33);
            }
            else
                str[i]='a';
        }
    }
    puts(str);
    return 0;
}
发表于 2023-09-03 11:51:56 回复(0)
//先判断小写字母,转成数字,再判断大写字母,字符加33即可转成小写字母下一位
#include <stdio.h>
#include<string.h>
int main() {
    char str[101];
    int len,i,j;
    gets(str);
    len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(str[i]>='a'&&str[i]<='c')
        str[i]='2';
        else if(str[i]>='d'&&str[i]<='f')
        str[i]='3';
        else if(str[i]>='g'&&str[i]<='i')
        str[i]='4';
        else if(str[i]>='j'&&str[i]<='l')
        str[i]='5';
        else if(str[i]>='m'&&str[i]<='o')
        str[i]='6';
        else if(str[i]>='p'&&str[i]<='s')
        str[i]='7';
        else if(str[i]>='t'&&str[i]<='v')
        str[i]='8';
        else if(str[i]>='w'&&str[i]<='z')
        str[i]='9';
        if(str[i]>='A'&&str[i]<='Y')
        str[i]+=33;
        else if(str[i]=='Z')
        str[i]='a';
    }
    printf("%s",str);
    return 0;
}
发表于 2023-07-29 23:33:06 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    
    char code[101] = { 0 };
    int i, len;
    scanf("%s",code);
    len = strlen(code);
    for(i = 0 ; i <= len - 1 ; i++){
        switch (code[i]) {
            case 'a' :     
            case 'b' :   
            case 'c' :  code[i] = '2';break;
            case 'd' :     
            case 'e' :   
            case 'f' :  code[i] = '3';break;
            case 'g' :     
            case 'h' :   
            case 'i' :  code[i] = '4';break;
            case 'j' :     
            case 'k' :   
            case 'l' :  code[i] = '5';break;
            case 'm' :     
            case 'n' :   
            case 'o' :  code[i] = '6';break;  
            case 'p' :     
            case 'q' : 
            case 'r' : 
            case 's' :  code[i] = '7';break; 
            case 't' :     
            case 'u' :   
            case 'v' :  code[i] = '8';break;
            case 'w' :     
            case 'x' : 
            case 'y' : 
            case 'z' :  code[i] = '9';break; 
            default: break;
        }
        if(code[i] >= 65 && code[i] <= 89){
            code[i] += 33;
        }
        if(code[i] == 'Z'){
            code[i] = 'a';
        }
        

    }
    printf("%s",code);
    return 0;
}

发表于 2023-03-31 16:43:21 回复(0)
#include <stdio.h>
#include<string.h>
char encipherer(char oop){
    char op;
    if(oop>='a'&&oop<='c') op='2';
    else if(oop>='d'&&oop<='f') op='3';
    else if(oop<='i'&&oop>='g') op='4';
    else if(oop>='j'&&oop<='l') op='5';
    else if(oop>='m'&&oop<='o') op='6';
    else if(oop<='s'&&oop>='p') op='7';
    else if(oop>='t'&&oop<='v') op='8';
    else if(oop>='w'&&oop<='z') op='9';
    else if(oop>='A'&&oop<='Z') op=(oop-'A'+1)%26+'a';
    else op=oop;
    return op;

}
int main() {
    char a[101];
    gets(a);
    int n=strlen(a),i;
    for(i=0;i<n;i++){
        printf("%c",encipherer(a[i]));
    }
    
    return 0;
}
发表于 2023-03-29 15:21:31 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <string.h>

int main() {
    char str[101];
    char table[] = "cfilosvz";
    scanf("%s", str);
    for (int i = 0; i < strlen(str); i++) {
        if (islower(str[i])) {
            for (int j = 0; j < 8; j++)
                if (str[i] <= table[j]) {
                    printf("%c", '2' + j);
                    break;
                }
        } else if (isupper(str[i])) {
            str[i] += str[i] == 'Z' ? 'A' - 'Z' : 1;
            printf("%c", tolower(str[i]));
        } else
            printf("%c", str[i]);
    }
}

发表于 2023-03-19 19:43:14 回复(0)

有没有佬来讲一下这是什么鬼,萌新要疯了。代码如下:
#include <stdio.h>

int main() {
    char pw[100];
    int i=0;
    scanf("%s",&(pw));
    while(i<100){
        if(pw[i]>='a'&&pw[i]<='c'){pw[i]='2';}
        if(pw[i]>='d'&&pw[i]<='f'){pw[i]='3';}
        if ('i'>=pw[i]&&pw[i]>='g') {pw[i]='4';}
        if('j'<=pw[i]&&pw[i]<='l'){pw[i]='5';}
        if('m'<=pw[i]&&pw[i]<='o'){pw[i]='6';}
        if('p'<=pw[i]&pw[i]<='s'){pw[i]='7';}
        if('t'<=pw[i]&&pw[i]<='v'){pw[i]='8';}
        if('w'<=pw[i]&&pw[i]<='z'){pw[i]='9';}
        if('A'<=pw[i]&&pw[i]<'Z'){pw[i]=pw[i]+33;}
        if(pw[i]=='Z'){pw[i]='a';}
        printf("%c",pw[i]);
        i++;
    }
    return 0;
}
我知道这是很笨的写法,但为啥会出问题啊?
发表于 2023-02-20 21:51:49 回复(2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char arr[100]={};
    gets(arr);
    int len = strlen(arr);
    for(int i=0;i<len;i++){
        switch(arr[i]){
            case 'a':
            case 'b':
            case 'c':arr[i]='2';break;
            case 'd':
            case 'e':
            case 'f':arr[i]='3';break;
            case 'g':
            case 'h':
            case 'i':arr[i]='4';break;
            case 'j':
            case 'k':
            case 'l':arr[i]='5';break;
            case 'm':
            case 'n':
            case 'o':arr[i]='6';break;
            case 'p':
            case 'q':
            case 'r':
            case 's':arr[i]='7';break;
            case 't':
            case 'u':
            case 'v':arr[i]='8';break;
            case 'w':
            case 'x':
            case 'y':
            case 'z':arr[i]='9';break;
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':arr[i]=arr[i]-'A'+'a'+1;break;
            case 'Z':arr[i]='a';break;
        }
    }
    printf("%s",arr);
    return 0;
}
看到很多使用密码表的,代码结构比自己的更加简单,最开始想到的是一连串的if-else判断,后来感觉比较麻烦就使用了switch-case进行处理,但是相对而言还是比直接使用密码表更加方便。
发表于 2023-01-02 18:15:53 回复(0)
int main(void){
    char input[100];
    gets(input);
    int count = strlen(input);
    for(int i = 0;i<count;i++){
        if(input[i]>= 'A' && input[i]<= 'Z'){
            if(input[i] + 33 > 'z'){
                printf("%c", (input[i] + 7)); //65 97
            }else {
                printf("%c", input[i] + 33); //65 97
            }            
            
        } else if(input[i]>= 'a' && input[i]<= 'z'){
            if(input[i] == 'a' || input[i] == 'b'|| input[i] == 'c'){
                printf("2"); //65 97
            } else if(input[i] == 'd' || input[i] == 'e'|| input[i] == 'f'){
                printf("3"); //65 97
            } else if(input[i] == 'g' || input[i] == 'h'|| input[i] == 'i'){
                printf("4"); //65 97
            } else if(input[i] == 'j' || input[i] == 'k'|| input[i] == 'l'){
                printf("5"); //65 97
            } else if(input[i] == 'm' || input[i] == 'n'|| input[i] == 'o'){
                printf("6"); //65 97
            } else if(input[i] == 'p' || input[i] == 'q'|| input[i] == 'r'|| input[i] == 's'){
                printf("7"); //65 97
            } else if(input[i] == 't' || input[i] == 'u'|| input[i] == 'v'){
                printf("8"); //65 97
            } else if(input[i] == 'w' || input[i] == 'x'|| input[i] == 'y' || input[i] == 'z'){
                printf("9"); //65 
            }
                
        } else {
            printf("%c",input[i]);
        }
    }
     //大写-》小写后一位
    //小写-》数字
    //数字
    //字符
    
    
    
}
发表于 2022-08-25 11:03:27 回复(0)
#include<stdio.h>
int main(){
    char c;
    while(~scanf("%c",&c)){
        if(c=='Z')
            c='a';
        else if('A'<=c&&c<'Z')
            c+=33;
        else if('a'<=c&&c<='z')
        {
            switch(c)
            {
                case 'a': case 'b': case 'c':c='2';break;
                case 'd': case 'e': case 'f':c='3';break;
                case 'g': case 'h': case 'i':c='4';break;
                case 'j': case 'k': case 'l':c='5';break;
                case 'm': case 'n': case 'o':c='6';break;
                case 'p': case 'q': case 'r': case 's':c='7';break;
                case 't': case 'u': case 'v':c='8';break;
                case 'w': case 'x': case 'y': case 'z':c='9';break;
            }
        }
        printf("%c",c);
    } 
}
发表于 2022-07-19 00:05:37 回复(0)
#include <stdio.h>

int main()
{
  char buf[96];
  int buf_len, i;
  
  scanf("%s", buf);
  buf_len = strlen(buf);
  for(i = 0; i < buf_len; i++)
  {
    if(buf[i] >= 'z')                   buf[i] = '9';
    else if(buf[i] >= 'q')              buf[i] = (buf[i] - 'q') / 3 + '7';
    else if(buf[i] >= 'a')              buf[i] = (buf[i] - 'a') / 3 + '2';
    else if(buf[i] >= 'A')              buf[i] = (buf[i] - 'A' + 1) % 26 + 'a';
  }

  printf("%s", buf);
}


发表于 2022-07-04 11:43:09 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int lowerchar_to_ninekeynum(int n)
{
    if(n < 'd' )
        n = '2';
    else if( n < 'g')
        n = '3';
    else if( n < 'j')
        n = '4';
    else if( n < 'm')
        n = '5';
    else if( n < 'p')
        n = '6';
    else if( n < 't')
        n = '7';
    else if( n < 'w')
        n = '8';
    else
        n = '9';
    return n;
}
#define upcase_to_lowercase(ch) ((ch + ('a' -'A')))
int main(void)
{
    char str[101];
    scanf("%s",str);
    
    int len =strlen(str);
    int i = 0;
    for(i = 0; i < len; i++)
    {
        if(str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] = lowerchar_to_ninekeynum(str[i]);
        }
        else if(str[i] >= 'A' && str[i] <= 'Z')
        {
            str[i] = upcase_to_lowercase(str[i]);
            str[i] = str[i] + 1;
            if(str[i] > 'z')
            {
                str[i] = ('a'+(str[i] - 'z' - 1)); 
            }
        }
    }
    printf("%s\n",str);
    
    return 0;
}
发表于 2022-06-16 16:00:51 回复(0)
#include<stdio.h>
#include<string.h>
int zhuanhuan(char p)
{
    int ret;
    if(p>='a'&&p<='c')
    {
        ret=2;
    }else if(p>='d'&&p<='f')
    {
        ret=3;
    }else if(p>='g'&&p<='i')
    {
        ret=4;
    }else if(p>='j'&&p<='l')
    {
        ret=5;
    }else if(p>='m'&&p<='o')
    {
        ret=6;
    }else if(p>='p'&&p<='s')
    {
        ret=7;
    }else if(p>='t'&&p<='v')
    {
        ret=8;
    }else
    {
        ret=9;
    }
    return ret;
}
int main()
{
    char str[101];
    int i,j,ret,len;
    scanf("%s",str);
    len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(str[i]>='a'&&str[i]<='z')
        {
            str[i]=zhuanhuan(str[i])+48;
        }else if(str[i]>='A'&&str[i]<='Y')
        {
            str[i]=str[i]+33;
        }else if(str[i]=='Z')
        {
            str[i]='a';
        }else
        {
            continue;
        }
    }
    printf("%s",str);
    return 0;
}

发表于 2022-05-11 17:03:10 回复(0)
#include <stdio.h>
#define    N    100
int main()
{
    char str[N];
    int i=0;
    scanf("%s",str);
    while(str[i]!='\0')
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            i++;
            continue;
        }
        else if(str[i]>='a'&&str[i]<='z')
        {
            if(str[i]>='a'&&str[i]<='c')
            {
                str[i]='2';
            }
            else if(str[i]>='d'&&str[i]<='f')
            {
                str[i]='3';
            } 
            else if(str[i]>='g'&&str[i]<='i')
            {
                str[i]='4';
            }
            else if(str[i]>='j'&&str[i]<='l')
            {
                str[i]='5';
            }
            else if(str[i]>='m'&&str[i]<='o')
            {
                str[i]='6';
            }
            else if(str[i]>='p'&&str[i]<='s')
            {
                str[i]='7';
            }
            else if(str[i]>='t'&&str[i]<='v')
            {
                str[i]='8';
            }
            else if(str[i]>='w'&&str[i]<='z')
            {
                str[i]='9';
            }
            i++;
        }
        else if(str[i]>='A'&&str[i]<='Y')
        {
            str[i]+='a'-'A'+1;
            i++;
        }
        else if(str[i]=='Z')
        {
            str[i]='a';
            i++;
        }
    }
    printf("%s\n",str);
    return 0;
}
//开始一直报错说超时了,我想几条if语句应该不至于,后来发现原来while循环内忘了写i++;
发表于 2022-04-16 11:01:28 回复(0)
送分题,只需要记住大小写字母ASCII码相差32即可
#include<stdio.h>
int main(){
    char in[1024];
    gets(in);
    for(int i=0;i<strlen(in);i++){
        if(in[i]>='A' && in[i]<='Z'){
            if(in[i]=='Z'){
                printf("a");
            }else{
                printf("%c",in[i]+32+1);
            }
        }else if(in[i]>='a' && in[i]<='c'){
            printf("2");
        }else if(in[i]>='d' && in[i]<='f'){
            printf("3");
        }else if(in[i]>='g' && in[i]<='i'){
            printf("4");
        }else if(in[i]>='j' && in[i]<='l'){
            printf("5");
        }else if(in[i]>='m' && in[i]<='o'){
            printf("6");
        }else if(in[i]>='p' && in[i]<='s'){
            printf("7");
        }else if(in[i]>='t' && in[i]<='v'){
            printf("8");
        }else if(in[i]>='w' && in[i]<='z'){
            printf("9");
        }else{
            printf("%c",in[i]);
        }
    }
    printf("\n");
}
发表于 2021-08-10 23:58:50 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char input[101];
    int i;
    while(gets(input))
    {
        int len=strlen(input);
        char output[101];
        for(i=0;i<len;i++)
        {
            if(input[i]=='Z')
            {
                output[i]='a';
            }
            else if(input[i]<'Z'&&input[i]>='A')
            {
                output[i]=input[i]+1-'A'+'a';
            }
            else if(input[i]<='c'&&input[i]>='a')
            {
                output[i]='2';
            }
            else if(input[i]<='f'&&input[i]>='d')
            {
                output[i]='3';
            }
            else if(input[i]<='i'&&input[i]>='g')
            {
                output[i]='4';
            }
            else if(input[i]<='l'&&input[i]>='j')
            {
                output[i]='5';
            }
            else if(input[i]<='o'&&input[i]>='m')
            {
                output[i]='6';
            }
            else if(input[i]<='s'&&input[i]>='p')
            {
                output[i]='7';
            }
            else if(input[i]<='v'&&input[i]>='t')
            {
                output[i]='8';
            }
            else if(input[i]<='z'&&input[i]>='w')
            {
                output[i]='9';
            }
            else
            {
                output[i]=input[i];
            }
        }
        output[i]='\0';
        printf("%s\n",output);
    }
    return 0;
}

发表于 2021-07-15 13:40:26 回复(0)