1 条题解

  • 0
    @ 2025-5-6 20:14:27

    解题思路

    1. 字符与数字转换函数
      • num2alph 函数:接受一个整数 c,如果 c0 则返回 '_',如果 c27 则返回 '.',否则返回 c - 1 + 'a',即将数字转换为对应的字母或特殊字符。
      • alph2num 函数:接受一个字符 c,如果 c'_' 则返回 0,如果 c'.' 则返回 27,否则返回 c - 'a' + 1,即将字母或特殊字符转换为对应的数字。
    2. 输入处理和字符转换
      • 使用 while 循环读取整数 k,当 k0 时结束循环。
      • 读取字符串 s,初始化结果字符串 ress,并获取字符串 s 的长度 n
      • 遍历字符串 s,使用 alph2num 函数将每个字符转换为数字存储在 cc 数组中。
    3. 加密或解密操作
      • 再次遍历字符串,计算索引 pi = k * i % n,将 cc[i] + i28 取余后的值存储在 pc[pi] 中。
    4. 输出结果
      • 遍历 pc 数组,使用 num2alph 函数将每个数字转换为字符,并更新结果字符串 res
      • 输出处理后的字符串 res
    #include<iostream>
    #include<string>
    using namespace std;
    
    char num2alph(int c){
    	if(c==0) return '_';
    	if(c==27) return '.';
    	return c-1+'a';
    }
    
    int alph2num(char c){
    	if(c=='_')
    		return 0;
    	if(c=='.')
    		return 27;
    	return c-'a'+1;
    }
    
    int k,cc[75],pc[75];
    
    int main(){
    	string s;
    	while(cin>>k&&k){
    		cin >> s;
    		string res = s;
    		int n = s.size();
    		for(int i = 0; i < n; i++){
    			cc[i] = alph2num(s[i]);
    			//cout << cc[i] << " ";
    		}
    		//cout << endl;
    		for(int i = 0; i < n; i++){
    			int pi = k*i%n;
    			pc[pi] = (cc[i]+i)%28;
    		}
    		for(int i = 0; i < n; i++)
    			res[i] = num2alph(pc[i]);
    		cout << res << endl;
    	}
    }
    
    
    • 1

    信息

    ID
    318
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者