|
//http://yzfy.org/dis/listpost.php?tid=980&extra=page%3D1
//算法题,实在是畏惧了。。我哪错了。
//==============================================================
//程序的写法是,每个功能块之间有个空行.
//功能块的说明注释在它的头上.
#define array_num 4
#include <iostream>
using namespace std;
void rolling3(char*,char*,char*);
void rolling1(char*,char*);
void rolling2(char*,char*);
void rolling(char*,char*,char*);
void copy_string(char*);
void cmpstring(char (*pstr)[200001]);
char str[100001]; //it' a temp;
char str1[200001];
char str2[100001];
char total_cmp_str3[5][200001];
int s1=0;
int s2=0;
int i=0;
int main()
{
char *Pstr=str,*Pstr1=str1,*Pstr2=str2;
char *temp=str;
int local_s1,local_s2;
while(cin>>str1>>str2)
{
int flag=0;
s1=strlen(str1);
s2=strlen(str2);
local_s1 =s1;
local_s2 =s2;
//两个字符串所有字符.进行分别比较.
//当遇到11 111;77 778899;
//功能块可以处理.即:当11 111时将处理.即flag=6;flag==2*3;
//77 778899.即flag=2;flag!=2*6;不满足条件.
for(int b=0;b<local_s1;b++)
{
for(int a=0;a<local_s2;a++)
{
if(str1==str2[a]){
flag++;
}
}
}
if(flag==local_s1*local_s2){
strcat(str1,str2);
cout<<str1<<endl;
continue;
}
if(s1==1||s2==1){ //两个字符串有一个长度为1时。
strcat(str1,str2);
cout<<str1<<endl;
continue;
}
//以下解决的思想,保持str1,str2的数值。
//要进行4次处理,处理后的字符串,保存在str1中。
//每处理一次,就把str1中的数值放到total_cmp_str3中。
//处理完成后,调用cmpstring函数.
strcpy(total_cmp_str3[3],str1);
strcpy(total_cmp_str3[4],str2);
rolling2(str1,str2);
cout<<"strcpy(str2,str1)\t\t"<<total_cmp_str3[0]<<endl;
strcpy(str1,total_cmp_str3[3]);
strcpy(str2,total_cmp_str3[4]);
rolling1(str1,str2);
cout<<"stcpy(str1,str2)\t\t"<<total_cmp_str3[1]<<endl;
strcpy(str1,total_cmp_str3[3]);
strcpy(str2,total_cmp_str3[4]);
rolling(str1,str2,str);
cout<<"rolling>> \t\t"<<total_cmp_str3[2]<<endl;
strcpy(str1,total_cmp_str3[3]);
strcpy(str2,total_cmp_str3[4]);
rolling3(str2,str1,str);
cout<<"rolling3>>\t\t"<<total_cmp_str3[3]<<endl;
cmpstring(total_cmp_str3);
i=0; // total_cmp_str3从0行,重新开始。
}
return 0;
}
void cmpstring(char (*pstr)[200001])
{
/* 这个注释内容无用.
// char* pstr[]=total_cmp_str3; //if(a<b&&a<c) {cout<<a;}
// int state=1; //if(a>b&&b>c) {cout<<c;} //这也太复杂了,要用到第三个存储空间.
// int size=strlen(total_cmp_str3[0]);
// char total_cmp_str3[5][200001];
*/
//解决思想是用指针数组存储total_cmp_str3各行指针。
//用库函数对各行进行比较。
//形如冒泡法.
//输出比较后的第一行.
char* temp;
char *s[]={total_cmp_str3[0],total_cmp_str3[1],total_cmp_str3[2],total_cmp_str3[3]};
for(int i=0;i<array_num;i++)
for(int j=i+1;j<array_num;j++)
if(strcmp(s,s[j])>0){
temp=s;
s=s[j];
s[j]=temp;
}
cout<<s[0]<<endl;
}
void rolling(char* Pstr1,char* Pstr2,char* Pstr)
{
//形如,"348" "67".
//"348"通过改变指针指向和"67"的第一个字符进行比较,
int state=1;
int cut_i=0;
char* temp;
int r_s1=s1,r_s2=s2;
while(state)
{
//如果大于,等于且"348"不是最后一个字符的时候.
//则是在"8"的位置,"8"存储到str中.并计算出截断以后的字符个数cut_i;
if(*Pstr1>*Pstr2)
{
temp=Pstr1; //保存当前位置.
while(*Pstr1!='\0') {
*Pstr++=*Pstr1++;
cut_i++;
}
Pstr1=temp;
//根据"67"的长度,把它粘贴到"34."即"8"的位置.
while(r_s2--) {
*Pstr1++=*Pstr2++;
}
r_s2++;
//存储的数据补回.
Pstr=str;
while(cut_i--) {
*Pstr1++=*Pstr++;
}
*Pstr1='\0';
// cout<<str1<<endl;
copy_string(str1);
state=0;
}
//如果小于,则移动"348"的指针.
else if(*Pstr1<=*Pstr2&&*(Pstr1+1)!='\0')
{
Pstr1++;
}
else if(*Pstr1==*Pstr2&&*(Pstr1+1)!='\0'&&*(Pstr2+1)!='\0'){
++Pstr1;
}
else //给个默认处理防止出错.
{
strcat(str1,str2);
copy_string(str1);
state=0;
}
}
}
//我都忘了针对什么了!???
void rolling3(char* Pstr1,char* Pstr2,char* Pstr) //Pstr1=str2 str2=str1;
{
//它的接收参数和rolling相反.所以,r_s1=s2;
//和默认处理要颠倒一样.
//我为什么不把它整和到rolling中呢.
int r_s1=s2,r_s2=s1;
int state=1;
int cut_i=0;
char* temp;
while(state)
{
if(*Pstr1>*Pstr2)
{
temp=Pstr1;
while(*Pstr1!='\0') {
*Pstr++=*Pstr1++;
cut_i++;
}
Pstr1=temp;
//根据"67"的长度,把它粘贴到"34."即"8"的位置.
while(r_s2--) {
*Pstr1=*Pstr2;
*Pstr1++;
*Pstr2++;
}
r_s2++; //为0;
//存储的数据补回.
Pstr=str;
while(cut_i--) {
*Pstr1++=*Pstr++;
}
*Pstr1='\0';
// cout<<str1<<endl;
copy_string(str2);
state=0;
}
else if(*Pstr1<=*Pstr2&&*(Pstr1+1)!='\0')
{
Pstr1++;
}
else if(*Pstr1==*Pstr2&&*(Pstr1+1)!='\0'&&*(Pstr2+1)!='\0'){
++Pstr1;
}
else //给个默认处理防止出错.
{
strcat(str2,str1);
copy_string(str2);
state=0;
}
}
}
void rolling1(char* Pstr1,char* Pstr2)
{
strcat(str1,str2);
copy_string(str1);
}
void rolling2(char* Pstr1,char* Pstr2)
{
strcat(str2,str1);
copy_string(str2);
// cout<<"rolling2#"<<str2<<endl;
}
void copy_string(char* Pstr1)
{
for(int j=0;*Pstr1!='\0';j++)
{
total_cmp_str3[j]=*Pstr1++;
}
total_cmp_str3[j]='\0';
i++;
}
[em4] [em4] [em4] [em4] [em4] |
|