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

📄 encode.cpp

📁 想要的人不要错过哦
💻 CPP
字号:
//************************************************************
//程序名称:字典问题
//
//
//
//
//
//编写者:谢日敏
//
//
//开发日期:2008年5月25日
//************************************************************



#include <stdio.h>
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<fstream.h>
#include<math.h>



double fac(int n); ///*************计算阶乘****************/
double Composite_operators(int i,int j);/*************复合运算****************/


void main()
{
	int checknum,stringLine=0,linenum=0,stringLinelength=0,n;
	double codenum; 
	char ch[7];
	char linestr[7];
	char *temp;
	
	//这里的InputStream用于读取字符串,也就是第一行之后的字符串
	ifstream InputStream("Input.txt");
	
	
	if(InputStream.fail())
	{ 
		cout<<" 不能打开文件: "<<"Input.txt"<<" 或者不存在数据!!!!!";
		cout<<" 请在检查Input.txt文件的路径是否正确!!!!! ";
	}
	
	
	//这里的GetStringLineNum用于读取行数,也就是K值
	ifstream GetStringLineNum("Input.txt");
	
	if(!GetStringLineNum){
		
		cout<<" 不能打开文件: "<<"Input.txt"<<" 或者不存在数据!!!!!";
		
		cout<<" 请在检查Input.txt文件的路径是否正确!!!!! ";
	}
	
	
	
	GetStringLineNum.getline(linestr,7);
	
	
	
	/*********取得行数k值***********/
	//atoi是字符串转换成整型函数
	
	linenum=atoi(linestr);
	
	
	
	GetStringLineNum.close();
	
	ofstream OutputStream("output.txt");
	
	if(!OutputStream)
	{
		cout<<"无法输出到"<<"output.txt"<<"文件";
	}
	
	
	//从读取input.txt文件中的、
	while (OutputStream && InputStream.getline(ch,20) && (linenum>=stringLine) )
	{
		// cout<<ch<<endl;
		int total[7],strLength;
		
		double sum1=0,sum2=0,codingNumber;
		
		stringLine++;
		
		temp=ch;
		
		//从第二行开始扫描
		if (stringLine>1)
		{
			strLength=strlen(ch);
			//判断不超过6个字符
			if (strLength>6)
			{ 
				cout<<"输入的"<<stringLine<<"行字符串,各自的长度要求不超过 6! ";
				cout<<"请重新尝试!"<<endl;
				return;
			}
			
			//升序判断
			for(int h=0;h<strLength-1;h++)
			{
				
				if ((temp[h]>temp[h+1]) ||(temp[h]==temp[h+1]))
				{ 
					cout<<"输入的"<<stringLine<<"行字符串不是按照升序排列! ";
					cout<<"请重新输入!"<<endl;
					return;
				}
			}

			//如果只有一个字符串直接输入其值
			
			if(strLength==1)
			{
				
				codingNumber=temp[0]-'a'+1;
				
			}
			else
			{
				
		
				
				
				for (int i=0;i<strLength;i++)
				{
					total[i]=temp[i]-'a'+1;
					
					//	cout<<"aaaa:::"<<total[i]<<endl;
				}
				
				
				//计算字符串所有组合个数

				for(int j=1;j<=strLength;j++)
				{
					sum1=sum1+Composite_operators(26,j);
				}

			//	cout<<"aaaa:::"<<sum1<<endl;
				
				int k=strLength;
				
				int m=0;
				
				//逆向计算所有可能的个数

				while((k>0)||(m<k))
				{ 
					sum2=sum2+Composite_operators((26-total[m]),k);
					k--;
					m++;
				}

	
				

				//计算编码位置
				codingNumber=(sum1-sum2);

				
				if (total[strLength-1]==26)
				{
					codingNumber=codingNumber+1;
				}
				


				//类型识别处理 

				
				codenum=codingNumber;
				
				checknum=(int)codingNumber;
				
				if ((codenum-checknum)!=0)
				{
					codingNumber=checknum+1;
				}

				
				//边界处理
				if(strcmp(temp,"stwxyz")>=0)
				{
					codingNumber++;
					
					OutputStream<<codingNumber;
				}
				else
					OutputStream<<codingNumber;
			}
			
			OutputStream<<endl;
			cout<<codingNumber<<endl;
		}
	}
	InputStream.close();
	OutputStream.close();
		}


/*************用递归计算阶乘****************/
double fac(int n)
{
	//当n为0或为1时返回1
	if(n==0||n==1)
		return 1;
	else 
		return fac(n-1)*n;
	
}


double Composite_operators(int i,int j)
{
	double result;
	result=(fac(i)/fac(i-j))/fac(j);
	return result;
}

⌨️ 快捷键说明

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