职责链模式和工厂模式混合求解一个简单的解密问题

本文介绍了一种基于字符串位置进行顺时针和逆时针旋转来实现加密与解密的算法。通过职责链模式实现了不同位置字符的旋转操作,并利用工厂模式创建具体的处理对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "oj.h"
#include <stdlib.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <typeinfo>
#include <vector>
#include <memory>
using namespace std;

/* 功能:取得解密串
 * 输入:intputstr :加密串
 * 输出:pOutputstr:解密串
 * 返回:解密成功返回0,否则返回-1
 */

/*
详细描述:

输入一篇加密后的字符串,输出解密后的字符串。

规则:

1.获得一段文字后,求出它的长度(包括空格)len。

2.进入加密运算的第1步:把所有下标是1倍数的字符做顺时针旋转。

3.进入加密运算的第2步:把所有下标是2倍数的字符做逆时针旋转。

4.进入加密运算的第3步:把所有下标是3倍数的字符做顺时针旋转。

5.按上面的规则,第奇数步按顺时针旋转,偶数步按逆时针旋转,一直到第len步为止。

 

例子:

比如原文是:abcde

1.获得长度len = 5

2.1的倍数有1、2、3、4、5,所以把这5个字符按顺时针旋转,得到eabcd。

3.2的倍数有2、4,所以把这2个字符按逆时针旋转,得到ecbad。

4.3的倍数有3,所以把这1个字符按顺时针旋转,得到ecbad。

5.4的倍数有4,所以把这1个字符按逆时针旋转,得到ecbad。

6.5的倍数有5,所以把这1个字符按顺时针旋转,得到ecbad。

最后的结果是ecbad。

*/
struct StManipulateStr
{
 static string revert(string strInput,unsigned int factor)
 {  
  unsigned int len=(strInput.size());
  unsigned int msize=len/factor; // 5/2=2,5/3=1,5/4=1,5/5=1
  if(msize<=1) return strInput;
  try
  {
  char* temp1=new char[len+1];
        char* temp2=new char[len+1];
  memcpy(temp1,strInput.c_str(),size_t(len));
  memcpy(temp2,strInput.c_str(),size_t(len));//输出延续输入
  temp1[len]='\0';
        temp2[len]='\0';

  for(int i=1;i<=msize;i++)
  {
   temp2[i*factor-1]=temp1[(msize-i+1)*factor-1];
  }
  std::cout<<endl<<"in StManipulateStr:"<<temp2<<endl;
  return string(temp2);
  }catch(...){}
  
 }
 static string clockwise(string strInput,unsigned int factor,bool flag)
 {  
  unsigned int len=(strInput.size());
  unsigned int msize=len/factor; // 5/2=2,5/3=1,5/4=1,5/5=1
  if(msize<=1) return strInput;

  std::cout<<endl<<"in StManipulateStr:"<<strInput<<endl;

  try
  {
  char* temp=new char[len+1];
  memcpy(temp,strInput.c_str(),size_t(len));
        temp[len]='\0';
  if(flag)//顺时针
  {
   char sentinel=temp[msize*factor-1];
   for(int i=msize;i>1;i--)
   {
    temp[i*factor-1]=temp[(i-1)*factor-1];
   }
   temp[factor-1]=sentinel;
  }
  else
  {
   char sentinel=temp[factor-1];
   for(int i=1;i<msize;i++)
   {
    temp[i*factor-1]=temp[(i+1)*factor-1];
   }
   temp[msize*factor-1]=sentinel;
  }
  std::cout<<endl<<"in StManipulateStr:"<<temp<<endl;
  return string(temp);
  }catch(...){}
  
 }
};
class AbsRequest
{
 virtual void convertResult(char*)=0;
};// 职责链模式的请求对象
class Request:public AbsRequest
{
public:
 Request(char* str)
 {
  _str=string(str);
  _resultStr=string(str);
  
 }
 int getLen(){return static_cast<int>(_str.size());}
 void setResult(string instr)
 {
  _resultStr=instr;
 }
 void convertResult(char* pbuf){strcpy(pbuf,_resultStr.c_str());}
 string getStr(){return _str;};
 string getResult(){return _resultStr;};
private:
 string _str;
 string _resultStr;
};
class AbsHandler
{
public:
 AbsHandler()
 {
  _nextHandler=NULL;
  cout<<endl<<"AbsHandler constructor"<<endl;
 }
 virtual ~AbsHandler(){}// 虚析构函数
 virtual bool handle(AbsRequest& mareq){std::cout<<"name of the para is:"<<typeid(mareq).name()<<endl; return true;};
 virtual AbsHandler* getNext(){return _nextHandler;};
 virtual void setNext(AbsHandler* mreq){_nextHandler=mreq;};
protected:
 AbsHandler* _nextHandler;
};
class ConcreteHandler:public AbsHandler
{
public:
 ConcreteHandler(bool flag,unsigned int fac):_flag(flag),_factor(fac){cout<<"ConcreteHandler constructor"<<endl;}
 ~ConcreteHandler(){cout<<"ConcreteHandler destructor"<<endl;}
 virtual bool handle(AbsRequest& mareq)
 {
  
  try
  {
   std::cout<<"in function handle:name of the para is:"<<typeid(mareq).name()<<endl;
   Request& mreq=dynamic_cast<Request&>(mareq); 
   mreq.setResult(StManipulateStr::clockwise(mreq.getResult(),_factor,_flag));//本节处理
   if(NULL==_nextHandler)
   {
    std::cout<<"next handler null"<<endl;
    return false;//什么也不做
   }
      return _nextHandler->handle(mreq); //继续下一步的处理
  }
  catch(bad_cast){}
  
 };
 
private:
 bool _flag;
 unsigned int _factor;
};
class AbsFactory
{
public:
 virtual ~AbsFactory(){}
 virtual AbsHandler* getProduct(bool,unsigned int fac )=0;
};
class HandlerFactory: public AbsFactory
{
public:
 HandlerFactory(){cout<<endl<<"HandlerFactory constructor "<<endl;}
 ~HandlerFactory(){cout<<"HandlerFactory destructor "<<endl;}
 AbsHandler* getProduct(bool flag,unsigned int fac)
 {
  return new ConcreteHandler(flag,fac);  
 }//getProduct
};
extern unsigned int GetDecrypt(char* intputstr, char** pOutputstr)
{
 if(NULL==intputstr||NULL==pOutputstr) return -1;
 try
 {
  
  auto_ptr<HandlerFactory> pmfac(new HandlerFactory);
  int len=string(intputstr).length();
  
  vector<AbsHandler*> hvec;

  for(int i=1;i<=len;i++)
  { 
   AbsHandler* han=pmfac->getProduct((1==(i%2)),i); 
   hvec.push_back(han);
  }
  vector<AbsHandler*>::iterator iter=hvec.begin();
        for(int i=0;i<len-1;i++)
  { 
   (*iter)->setNext(hvec.at(i+1));
   iter++;
  }
  Request mreq(intputstr);// 新建一个需求
  hvec.at(0)->handle(mreq);//处理需求
  
  
  char* buf=(char*)malloc(mreq.getLen()+1);//开辟内存
  mreq.convertResult(buf);//复制结果
  *pOutputstr=buf;//输出结果
  
 }catch(...){}
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值