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