1048. 数字加密

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

输入格式:

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

输出格式:

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

输入样例:

1234567 368782971

输出样例:

3695Q8118

程序代码:

#include<stdio.h>
typedef struct
{
  char c[201];
  int top;
}stack;
void initStack(stack* s)
{
  s->top = -1;
}
void push(stack* s,char m)
{
  s->top++;
  s->c[s->top]=m;
}
char pop(stack* s)
{
  char tmp=s->c[s->top];
  s->top--;
  return tmp;
}
int main()
{
  char c;
  stack s;
  int i=0;
  char a[101];
  for(i=0;i<101;i++)
    a[i]='0';
  char b[101];
  for(i=0;i<101;i++)
                b[i]='0';

  initStack(&s);
  while((c=getchar())!='\n')
  {
    push(&s,c);
  }
  int flag=0;
  char temp;
  i=100;
  int j=100;
  while(s.top!=-1)
  {
    temp=pop(&s);
    if(temp!=' '&&flag==0)
    {
      b[i--]=temp;
    }
    else if(temp==' ')
    {
      flag = 1;
    }
    else if(temp!=' '&&flag==1)
    {
      a[j--]=temp;
    }
  }
  int min=(i<j)?i:j;
  i=100;
  for(i=100;i>min;i--)
  {
    if(i%2==1)
    {
      a[i]=b[i]-a[i];
      if(a[i]<0)
        a[i]=a[i]+10+'0';
      else
        a[i]=a[i]+'0';
    }
    else if(i%2==0)
    {
      a[i]=(a[i]-'0'+b[i]-'0')%13;
      if(a[i]>=0&&a[i]<=9)
        a[i]=a[i]+'0';
      else if(a[i]==10)
        a[i]='J';
      else if(a[i]==11)
        a[i]='Q';
      else if(a[i]==12)
        a[i]='K';
    }
  }
  i=0;
  for(i=min+1;i<=100;i++)
  {
      putchar(a[i]);
  }

  return 0;
}