【每日打卡】Day16:加密 C++实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40184885/article/details/89740068

给定一个整数n,之后有n个字符串。针对每个字符串,将数据6个为一组分组,最后一组可能不满6个。比如”huazhongU”,将其分为”huazho” “ngU”,求出6个数字,每个数字分别为对应位置上的字母ASCII码的和。比如’h’ + ‘n’ = 214,’u’ + ‘g’ = 220,得到如下6个数字:214, 220, 182, 122, 104, 111。

之后,针对每个数字,按照数位求和,如果求和结果超过一位,重复执行这个过程直到结果仅为1位。如 ‘a’ + ‘U’ = 182 => 1 + 8 + 2 = 11 => 1 + 1 = 2。对6个数字分别操作结果即位最后的密码。

注意,每个字符串可能有任意长。

样例输入:

2
huazhongU
shangjiaoU

样例输出:

742553
431647

求解代码:

#include <bits/stdc++.h>

using namespace std;

//取各数位之和  运用了递归的思想
int getnumber(int a){
    int f = 0;
    while(a > 0){
        f += a % 10;
        a /= 10;
    }
    if(f < 10)
        return f;
    return getnumber(f);
}


void getans(string s[],int all){
    //加密后的数组最多6位  因此建立一个长度为6的数组
    int pswd[6];
    for(int i = 0; i < 6; i ++)
        pswd[i] = 0;
    for(int i = 0; i < 6; i ++){
        for(int j = 0; j < all-1; j ++){
            //取各位的ASCII码
            pswd[i] += s[j][i];
        }
    }
    for(int i = 0; i < s[all-1].size(); i ++)
        //最后一组长度可能不足6
        pswd[i] += s[all-1][i];

    for(int i= 0; i < s[0].size(); i ++)
        cout << getnumber(pswd[i]) ;
    cout << endl;
}

int main(){
    int n;
    cin >> n;
    while(n--){
        string str; cin >> str;
        int len = str.size();
        int all;
        if(len % 6 == 0)
            all = len / 6;
        else all = len / 6 + 1;
        string s[all];
        int k= 0;
        for(int i = 0; i < all ; i ++){
            for(int j = 0; j < 6; j ++){
                if(k < len)
                    s[i] += str[6*i+j];
                k++;
            }
        }
        getans(s,all);
    }
    return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页