⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 RSA加密中的大整数运算
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include"BigIntcpp.cpp"
#include"Prime.cpp"
string help();
string input(char *str);
 BigInt VAR[20],EXP[20];
int markvar=0,markexp=0;
bool IsV=0;
bool IsE=0;
string domain(int select,char *str)
{

		//CString stra="\0";
//SetDlgItemText(IDC_EDIT1,stra);
//char *str=new char[100000];
	char *str1=new char[100000];
	char *str2=new char[100000];
	char *str3=new char[100000];
	BigInt o1,o2,o3,result,remainder,Ones,Full;
	string p1,p2,p3;
	bool BOOL;
	char c[10];
	int i=0,inverse=0;
	string one="1",helpfile,inputvar;
	Ones.loadDEC(one);
    char varbuf[3];
	char yes;



//	cout<<endl<<endl<<"                               具体操作请看帮助文件"<<endl<<endl<<endl;
//restart:


     IsV=false;
     IsE=false;
//	strcpy(str,"\0");
	strcpy(str1,"\0");
	strcpy(str2,"\0");
	strcpy(str3,"\0");
	strcpy(varbuf,"\0");
	char tmp[5];
	i=0;inverse=0;



  //  cout<<endl<<endl<<"                               提供的操作类型"<<endl<<endl;
   // cout<<endl<<endl<<"   1   双操作数运算  +  -  *  /  %  ^  ==  !=  >  <  <<=  >>=  ~(最大公约数)"<<endl;

//    cout<<endl<<endl<<"   2   单操作数运算  ++  --  "<<endl;

//    cout<<endl<<endl<<"   3   三操作数运算  模+  模-  模*  模/  模^  求逆-"<<endl;

  //  cout<<endl<<endl<<"   v   操作数输入(以-1结束)"<<endl;

	//cout<<endl<<endl<<"   h   帮助文件与输入例子"<<endl;
//	cout<<endl<<endl<<endl<<"请输入你需要的操作:";
//int select;
//char sel[500];
//cin>>sel;
/*
if(!strcmp(sel,"1"))select=1;
else if(!strcmp(sel,"2"))select=2;
else if(!strcmp(sel,"3"))select=3;
else if(!strcmp(sel,"h"))select=4;
else if(!strcmp(sel,"v"))select=5;
else
{
	cout<<endl<<endl<<"选择无效,请重新输入"<<endl<<endl;
	goto restart;
}
*/
	
switch (select)
{
case 2:
	{

   //  cout<<endl<<endl<<"请输入操作计算式子 :"<<endl<<endl;
   //  cin>>str;

	 	int j=0;
	 if(str[i]=='v'||str[i]=='V')
	 {
		 i+=3;
		 	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))varbuf[j++]=str[i++];
         else break;
	}
			varbuf[j]='\0';
    int varint=atoi(varbuf);
    o1=VAR[varint];

	 }
	else if(str[i]=='e'||str[i]=='E')
	 {
		 i+=3;
		 	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))varbuf[j++]=str[i++];
         else break;
	}
			varbuf[j]='\0';
    int varint=atoi(varbuf);
    o1=EXP[varint];

	 }
	else
	{

	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))str1[i]=str[i++];
         else break;
	}
	str1[i]='\0';
	p1=str1;
	o1.loadDEC(p1);
	}


    j=0;

	while(i<strlen(str))
	{
        if((str[i]<int('0')||str[i]>int('9'))&&str[i]!='v'&&str[i]!='V'&&str[i]!='e'&&str[i]!='E')c[j++]=str[i++];
         else break;
	}
	c[j]='\0';
	j=0;


	 if(str[i]=='v'||str[i]=='V')
	 {
		 i+=3;
		 	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))varbuf[j++]=str[i++];
         else break;
	}
			varbuf[j]='\0';
    int varint=atoi(varbuf);
    o2=VAR[varint];

	 }
	else if(str[i]=='e'||str[i]=='E')
	 {
		 i+=3;
		 	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))varbuf[j++]=str[i++];
         else break;
	}
			varbuf[j]='\0';
    int varint=atoi(varbuf);
    o2=EXP[varint];

	 }
	else
	{
	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))str2[j++]=str[i++];
         else break;
	}
	str2[j]='\0';

	p2=str2;
	//cout<<str1<<c<<str2<<endl;

	o2.loadDEC(p2);  
	}
      cout<<endl<<endl<<str;
	  if(str[strlen(str)-1]!='=')cout<<"=";
	          switch(c[0])
			  {
			  case '+':
				  result=o1+o2;
			//	  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
			//	   //cin>>yes;
				//   //if(yes=='y'||yes=='Y')
				 // {
					  EXP[markexp%20]=result;
                   //   //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				 // }
					  _itoa((markexp-1)%20,tmp,10);

					  return result.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();
				  break;
			  case '-':
				  result=o1-o2;
				  		//		  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
			//	   //cin>>yes;
			//	   //if(yes=='y'||yes=='Y')
			//	  {
					  EXP[markexp%20]=result;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
			//	  }
               					  _itoa((markexp-1)%20,tmp,10);

					  return result.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();
				  break;
			  case '*':
				  result=o1*o2;
			//	  				  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
			//	   //cin>>yes;
			//	   //if(yes=='y'||yes=='Y')
			//	  {
					  EXP[markexp%20]=result;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
			//	  }
               					  _itoa((markexp-1)%20,tmp,10);

					  return result.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();
				  break;
			  case '/':
				  result=Remainder(o1,o2,remainder);
				
				  				  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
				   //cin>>yes;
				   //if(yes=='y'||yes=='Y')
				  {
					  EXP[markexp%20]=result;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				  } 

				  					  _itoa((markexp-1)%20,tmp,10);

			   return result.outputDEC()+"..."+remainder.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();

				 
				  break;
			  case '%':
				  result=o1%o2;
				  				  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
				   //cin>>yes;
				   //if(yes=='y'||yes=='Y')
				  {
					  EXP[markexp%20]=result;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				  }
				                 					  _itoa((markexp-1)%20,tmp,10);

					  return result.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();
				  break;
			  case '^':
				  {
				  Full.setFull();  //因为要调用model乘,所以把mod(n)中的n设为最大
			//	  Full.outputDEC();
				  result=BImodexp(o1,o2,Full);
				  
				  				  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
				   //cin>>yes;
				   //if(yes=='y'||yes=='Y')
				  {
					  EXP[markexp%20]=result;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				  }
				                 					  _itoa((markexp-1)%20,tmp,10);

					  return result.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();
				  break;
				  }
			  case '~':
				  result=BIgcd(o1,o2);
				  				  //cout<<endl<<"是否要存储结果?     "<<result.outputDEC()<<endl;
				   //cin>>yes;
				   //if(yes=='y'||yes=='Y')
				  {
					  EXP[markexp%20]=result;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				  }
               					  _itoa((markexp-1)%20,tmp,10);

					  return result.outputDEC()+"已设置EXP"+tmp+"="+EXP[(markexp-1)%20].outputDEC();
				  break;
		      case '>':
				  if(!strcmp(c,">"))
				  {
				  BOOL=o1>o2;				  
				  if(BOOL)return "1";else return "0";
				  break;
				  }
				  else if(!strcmp(c,">>="))
				  {
				      short  iBit;
					  iBit=(short)atoi(str2);
					  o1>>=iBit;
					  				  {
					  EXP[markexp%20]=o1;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				  }
					  return result.outputDEC();;
					 // cout<<o1.outputDEC()<<endl;
				      break;
				  }
			  case '<':
				  {
				  if(!strcmp(c,"<"))
				  {
				  BOOL=o2>o1;
				  if(BOOL)return "1";else return "0";
				  break;
				  }
                  else if(!strcmp(c,"<<="))
				  {
				      short  iBit;
					  iBit=(short)atoi(str2);
					  o1<<=iBit;
					  {
					  EXP[markexp%20]=o1;
                      //cout<<endl<<"已存储结果为:EXP"<<markexp<<"="<<result.outputDEC()<<endl;  
					  markexp++;
				  }
					  return result.outputDEC();;
					//  cout<<o1.outputDEC()<<endl;
				      break;
				  }
				  }
			    case '=':
				  if(!strcmp(c,"=="))
				  {
				  BOOL=o1==o2;
				  if(BOOL)return "1";else return "0";
				  break;
				  }
			    case '!':
				  if(!strcmp(c,">"))
				  BOOL=o1!=o2;
				  if(BOOL)return "1";else return "0";
				  break;

				default:return "没定义这个操作符";
			  }
			
	
	break;
	}//case 1

case 1:
		{
       //        cout<<endl<<endl<<"请输入操作计算式子 :"<<endl<<endl;
       //        cin>>str;
			   int j=0,varint,n;
			   __int64 nn;

	if(str[i]=='v'||str[i]=='V')
	 {
		 i+=3;
		 	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))varbuf[j++]=str[i++];
         else break;
	}
			varbuf[j]='\0';
     varint=atoi(varbuf);
    o1=VAR[varint];
	IsV=true;

	 }
	else if(str[i]=='e'||str[i]=='E')
	 {
		 i+=3;
		 	while(i<strlen(str))
	{
        if(str[i]>=int('0')&&str[i]<=int('9'))varbuf[j++]=str[i++];
         else break;
	}
			varbuf[j]='\0';
     varint=atoi(varbuf);
    o1=EXP[varint];
	IsE=true;

	 }
	else
	{
	           while(i<strlen(str))
			   {
                       if(str[i]>=int('0')&&str[i]<=int('9'))str1[i]=str[i++];
                         else break;
			   }
	             str1[i]='\0';
                  p1=str1;
             
                	o1.loadDEC(p1);

	}
	              j=0;
             	while(i<strlen(str))
				{
                     if((str[i]<int('0')||str[i]>int('9'))&&str[i]!='=')c[j++]=str[i++];
                     else break;
				}
                 	c[j]='\0';


                   cout<<endl<<endl<<str;
	              if(str[strlen(str)-1]!='=')cout<<"=";
				  switch(c[0])
				  {
				  case '+':
					  o1++;
					  
					  if(IsV)
					  VAR[varint]=o1;
					  if(IsE)
                       EXP[varint]=o1;
					  return o1.outputDEC();
					  break;
				  case '-':
					  o1--;
					  
				      if(IsV)
					  VAR[varint]=o1;
					  if(IsE)
                       EXP[varint]=o1;
					  return o1.outputDEC();
					  break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -