📄 encode.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 + -