![在这里插入图片描述](https://img-blog.csdnimg.cn/20210708202403630.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjU4NTE5OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210708202407749.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjU4NTE5OQ==,size_16,color_FFFFFF,t_70)
二刷
此题要事先保存长度。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<string> v;
string a,b;
cin>>a>>b;
int n=a.size();//事先保存
int m=b.size();//事先保存
if(n>m) for(int i=0;i<n-m;i++) b='0'+b;//这里的条件用到了size(),并且目的是要改变size(),一定要事先保存长度
else if(n<m) for(int i=0;i<m-n;i++) a='0'+a;
for(int i=a.size()-1,k=1;i>=0;i--,k++){
if(k%2!=0){
string temp=to_string((a[i]-'0'+b[i]-'0')%13);
if(temp=="10") temp="J";
else if(temp=="11") temp="Q";
else if(temp=="12") temp="K";
v.push_back(temp);
}else{
string temp;
if((b[i]-'0')-(a[i]-'0')<0) temp=to_string((b[i]-'0')-(a[i]-'0')+10);
else temp=to_string((b[i]-'0')-(a[i]-'0'));
v.push_back(temp);
}
}
for(auto it=v.rbegin();it!=v.rend();it++) cout<<*it;
return 0;
}
柳神代码
分析:⾸先将a和b倒置,将字符串a和b中较短的那个末尾添加0直到两个字符串长度相等,然后从0开始依次处理每⼀位,如果当前位是奇数位(i % 2 == 0)则将a[i]的数字加上b[i]的数字再对13取余,结果添加在字符串c的末尾;如果是偶数位,计算b[i]和a[i]的差值,如果⼩于0就加10,然后将结果添加在字符串c的末尾,最后倒序输出字符串c~
学习:
char str[14] = { "0123456789JQK" };//学习这种写法
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string a, b, c;
cin >> a >> b;
int lena = a.length(), lenb = b.length();
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if (lena > lenb)
b.append(lena - lenb, '0');
else
a.append(lenb - lena, '0');
char str[14] = { "0123456789JQK" };//学习这种写法
for (int i = 0; i < a.length(); i++) {
if (i % 2 == 0) {
c += str[(a[i] - '0' + b[i] - '0') % 13];
}
else {
int temp = b[i] - a[i];
if (temp < 0) temp = temp + 10;
c += str[temp];
}
}
for (int i = c.length() - 1; i >= 0; i--)
cout << c[i];
return 0;
}
我的代码
部分通过,tmd
注意:
1,字符串的length()
要加括号
2,(b[i] - '0' + a[j] - '0') % 13 == 10
,这种判断一定要带上- '0'
,要不然会判断错误的。
3,(b[i] - '0' + a[j] - '0') % 13 == 11
,这种判断一定要带上- '0'
,要不然会判断的数是不一样的,比如int类型的8+char类型的9不会等于9的
#include <iostream>
#include <string>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
int n = 0;
if (b.length() > a.length()) {
n = b.length() - a.length();
for (int i = 0; i < n; i++) {
cout << b[i];
}
//这里要多定义一个j来遍历a.
for (int i = n, j = 0; i < b.length() && j < a.length(); i++, j++) {
if (((b.length() - i) % 2) != 0) {//奇数位
if ((b[i] - '0' + a[j] - '0') % 13 == 10) { cout << "J"; }
else if ((b[i] - '0' + a[j] - '0') % 13 == 11) { cout << "Q"; }
else if ((b[i] - '0' + a[j] - '0') % 13 == 12) { cout << "K"; }
else { cout << (b[i] - '0' + a[j] - '0') % 13; }
}
if (((b.length() - i) % 2) == 0) {
if ((b[i] - '0') - (a[j] - '0') < 0) { cout << (b[i] - '0') - (a[j] - '0') + 10; }
else { cout << (b[i] - '0') - (a[j] - '0'); }
}
}
}
if (b.length() == a.length()) {
for (int i = n, j = 0; i < b.length() && j < a.length(); i++, j++) {
if (((b.length() - i) % 2) != 0) {//奇数位
if ((b[i] - '0' + a[j] - '0') % 13 == 10) { cout << "J"; }
else if ((b[i] - '0' + a[j] - '0') % 13 == 11) { cout << "Q"; }
else if ((b[i] - '0' + a[j] - '0') % 13 == 12) { cout << "K"; }
else { cout << (b[i] - '0' + a[j] - '0') % 13; }
}
if (((b.length() - i) % 2) == 0) {
if ((b[i] - '0') - (a[j] - '0') < 0) { cout << (b[i] - '0') - (a[j] - '0') + 10; }
else { cout << (b[i] - '0') - (a[j] - '0'); }
}
}
}
if (b.length() < a.length()) {
for (int i = n, j = 0; i < b.length() && j < a.length(); i++, j++) {
if (((b.length() - i) % 2) != 0) {//奇数位
if ((b[i] - '0' + a[j] - '0') % 13 == 10) { cout << "J"; }
else if ((b[i] - '0' + a[j] - '0') % 13 == 11) { cout << "Q"; }
else if ((b[i] - '0' + a[j] - '0') % 13 == 12) { cout << "K"; }
else { cout << (b[i] - '0' + a[j] - '0') % 13; }
}
if (((b.length() - i) % 2) == 0) {
if ((b[i] - '0') - (a[j] - '0') < 0) { cout << (b[i] - '0') - (a[j] - '0') + 10; }
else { cout << (b[i] - '0') - (a[j] - '0'); }
}
}
}
return 0;
}