• 1048 数字加密


    本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

    输入格式:
    输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

    输出格式:
    在一行中输出加密后的结果。

    输入样例:
    1234567 368782971



    输出样例:
    3695Q8118

    我只能说这波和出题人配合的不好,2,5测试点不过,改代码后,测试点2过了5还没过,凎!

    #include <iostream>
    #include<string>
    using namespace std;
    int main() {
        string a, b,c;
        cin >> a >> b;
        int k = 1,x,i,j;
        for ( i = b.size() - 1, j = a.size() - 1; i >= 0&&j>=0; i--, j--,k++) {//运算到某一字符串没有字符为止。
            if (k % 2 == 1) {//奇数项
                x = (b[i] + a[j] - 2 * '0') % 13;
                if (x == 10) 
                    c.insert(c.begin(),'J');
                else  if (x == 11)
                    c.insert(c.begin(), 'Q');
                else  if (x == 12)
                    c.insert(c.begin(), 'K');
                else
                    c.insert(c.begin(), x + '0');
               
            }
            else {//偶数项
                x = b[i] - a[j];
                if (x < 0)
                    c.insert(c.begin(), x + 10 + '0');
                else
                    c.insert(c.begin(), x + '0');
            }
       
        }
        while (i >= 0) {//b够a不够
            c.insert(c.begin(), b[i]);
            i--;
        }
        while(j>=0)
        {   if(k%2==1//奇数项
                c.insert(c.begin(),a[j]);
            else{//偶数项
                char ch=10-(a[j]-'0')+'0';
                c.insert(c.begin(),ch);//测试点5过不了
            }
            j--;
            k++;
        }
        cout << c<<endl;
    }

    重写的代码,测试点2,5不过的原因是当b小于a时,b要补0计算。两种方法,一种是头插法,一种是尾插法。

    #include <iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    int main() {
        string a, b,c;
        int k = 1,x;
        cin >> a >> b;
        if (a.size() > b.size()) 
            for (int i = b.size(); i < a.size(); i++)
                b.insert(b.begin(), '0');
        
        else
            for (int i = a.size(); i < b.size(); i++)
                a.insert(a.begin(), '0');
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        for (int i = 0; i < a.size(); i++,k++) {
            if (k % 2 == 1) {//奇数项
                x = (b[i] + a[i] - 2 * '0') % 13;
                if (x == 10)
                    c.insert(c.end(), 'J');
                else  if (x == 11)
                    c.insert(c.end(), 'Q');
                else  if (x == 12)
                    c.insert(c.end(), 'K');
                else
                    c.insert(c.end(), x + '0');
    
            }
            else {//偶数项
                x = b[i] - a[i];
                if (x < 0)
                    c.insert(c.end(), x + 10 + '0');
                else
                    c.insert(c.end(), x + '0');
            }
        }
        reverse(c.begin(), c.end());
        cout << c << endl;
    }
  • 相关阅读:
    SQL SERVER 分布式事务(DTC)
    .NET 笔试题--自已作答
    设计模式-观察者模式
    设计模式-迭代器模式
    设计模式-责任链模式
    C#中引用类型和值类型
    另一个 OleDbParameterCollection 中已包含 OleDbParameter 错误分析及解决办法
    R语言笔记-set.seed()函数
    R中的sample函数
    R语言包相关命令
  • 原文地址:https://www.cnblogs.com/kalicener/p/12467906.html
Copyright © 2020-2023  润新知