1.题目描述
本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。
输入格式:
输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
2.解题过程
本题很简单,但是由于对题目理解不够准确,没有注意到如果A的长度大于B时是需要将B不足的位数用0补足的,导致提交后有两个测试点总是过不去,很难过。
本来代码应该更简洁一些,但是因为是在第一遍的基础上改的,因此最后单独处理了A大于B的情况。
代码:
/*B1048*/
#include<cstdio>
#include<cstring>
#define NUM 105
int main(){
char a[NUM],b[NUM];
scanf("%s",&a);
scanf("%s",&b);
int lenA=strlen(a),lenB=strlen(b);
int count = 1;
//int j = lenA-1;
for(int i=lenB-1,j=lenA-1;i>=0&&j>=0;i--,j--){
if(count%2==0){ //偶数位
int temp = b[i]-a[j];
if(temp<0)
b[i] = temp+'0'+10;
else
b[i] = temp + '0';
}
else{ //奇数位
int temp = (a[j]-'0'+b[i]-'0')%13;
if(temp<10)
b[i] = temp + '0';
else{
switch(temp){
case 10:b[i] = 'J';break;
case 11:b[i] = 'Q';break;
case 12:b[i] = 'K';
}
}
}
count++;
//j = ((j-1)+lenA)%lenA;
}
int n = lenA-lenB;
if(lenA>lenB){
for(int i=n-1;i>=0;i--){
if(count%2==1){//奇数
int temp = (a[i]-'0'+0)%13;
if(temp<10)
a[i] = temp + '0';
else{
switch(temp){
case 10:a[i] = 'J';break;
case 11:a[i] = 'Q';break;
case 12:a[i] = 'K';
}
}
}
else{ //偶数
int temp = 0-(a[i]-'0');
if(temp<0)
a[i] = temp+'0'+10;
else
a[i] = temp+'0';
}
count++;
}
for(int i=0;i<n;i++){
printf("%c",a[i]);
}
}
for(int i=0;i<lenB;i++){
printf("%c",b[i]);
}
return 0;
}
3.基础知识复习
后来看了一些别人的方法,发现多少是用反转函数将字符串反转后处理的。
STL中的reverse()函数可以直接使用,适用于所有容器。
eg:
/*B1048*/
#include<iostream>
#include<cstring>
#include<vector>
#define NUM 105
using namespace std;
int main(){
vector <int> v1;
vector <int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 9 ; i++ )
{
v1.push_back( i );
}
cout<<"原序列"<<endl;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout<<endl;
reverse (v1.begin( ), v1.end( ) );
cout << "反转后序列:"<<endl;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
}
另外还可以自己编写一个反转函数,用于一般的数组。方法是从两端向中间交换元素:
void reserse(char s[]){
int len = strlen(s);
for(int i= 0;i<len/2;i++){
int temp = s[i]; //交换s[i],s[len-1-i]
s[i] = s[len - 1 - i];
s[len - 1 - i] = temp;
}
}