1048 数字加密 (20 分) (C语言/c++)

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

输入格式:

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

输出格式:

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

输入样例:

1234567 368782971

结尾无空行

输出样例:

3695Q8118

结尾无空行

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a,b;
    vector<char> t;
    cin>>a>>b;
        while(a.size()>b.size())b='0'+b;
        while(a.size()<b.size())a='0'+a;
    int i,j=1;
    for(i=a.size()-1;i>=0;i--){
        if(j%2==1){
            int temp=((a[i]-'0')+(b[i]-'0'))%13;
            if(temp==10)t.push_back('J');
            else if(temp==11)t.push_back('Q');
            else if(temp==12)t.push_back('K');
            else t.push_back(temp+'0');
            j++;
            }
        else {t.push_back(((b[i]-'0')-(a[i]-'0'))<0?((b[i]-'0')-(a[i]-'0'))+10+'0':((b[i]-'0')-(a[i]-'0'))+'0');j++;}
    }
    reverse(t.begin(),t.end());
    for(i=0;i<t.size();i++)cout<<t[i];
    return 0;
}

c的解法

#include<stdio.h>
#include<string.h>
int main(){
    char a[101],b[101],c[101],flag=1;
    scanf("%s",a);
    scanf("%s",b);
    int len_a=strlen(a),len_b=strlen(b),i;
    int n=len_a-len_b;
    getchar();
    if(n>0){//A长于B,B前面补0
        for(i=len_b-1;i>=0;i--)
            b[i+n]=b[i];
        for(i=0;i<n;i++)
            b[i]='0';
    }
    else if(n<0){//B长于A
        n*=-1;
        for(i=len_a-1;i>=0;i--)
            a[i+n]=a[i];
        for(i=0;i<n;i++)
            a[i]='0';
    }
    int k=strlen(b),q=strlen(a),s=strlen(b);
    for(i=k-1;i>=0;i--){
        if(flag==1)
        {
            int nu=((a[q-1]-'0')+(b[k-1]-'0'))%13;
            if(nu<10)
            c[i]=nu+'0';
            else if(nu==10)c[i]='J';
            else if(nu==11)c[i]='Q';
            else if(nu==12)c[i]='K';
            flag=0;
            k--;
            q--;
        }
        else if(flag==0)
        {
            int nn=((b[k-1]-'0')-(a[q-1]-'0'));
            if(nn>=0)
            c[i]=nn+'0';
            else if(nn<0)
            c[i]=(nn+10)+'0';
            flag=1;
            k--;
            q--;
        }
    }
    for(i=0;i<s;i++)printf("%c",c[i]);
    printf("\n");
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值