您的位置:首页 > 其它

1048. 数字加密(20)

2018-03-03 09:44 218 查看
本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。输入格式:输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。输出格式:在一行中输出加密后的结果。输入样例:
1234567 368782971
输出样例:3695Q8118
个人分析:此题难度本身不大,但是有很多陷阱。        本来,从题目给的例子来看,涉及到不同位的数相加,第一想到的是用栈。但是一直有两个测试点通不过,看了网上的答案,才知道这根本不是 不同位的数相加,如果某一个数长度小于另一个数,就在那个数前补0,而题目根本没有对此说明,可以说是很坑了。

代码:#include<iostream>
#include<stack>
#include<string>
using namespace std;

int main()
{
char sign[13] = {'0','1','2','3','4','5','6','7','8','9','J','Q','K'};
string a,b;
int i;
int count=1;
cin>>a>>b;

stack<int>stk1,stk2,res;

//在长度较小的数前补0
int s2=b.size(),s1=a.size();
while(s2 - s1 <0 )
{stk2.push(0);s2++;}
while(s1 - s2 <0 )
{stk1.push(0);s1++;}

for(i=0;i<a.size();i++)
stk1.push(a[i]-'0');
for(i=0;i<b.size();i++)
stk2.push(b[i]-'0');

//取数运算
while( !stk1.empty())
{
if(count%2 != 0) //奇数位
res.push( (stk1.top()+stk2.top())%13 );
else //偶数位
{
int temp = stk2.top() - stk1.top();
if(temp<0)
temp = temp+10;
res.push(temp);
}
count++;
stk1.pop();
stk2.pop();
}

//输出结果
while( !res.empty() )
{
cout<< sign[res.top()];
res.pop();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: