B1048. 数字加密(20)

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值