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

给定一个整数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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值