1. 报数游戏
问题描述:
设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M个人时,此人出圈,再从他的下一个人重新开始1到M的报数,如此进行下去直到所有的人都出圈为止。现要打印出出圈次序。
要求实现函数:
void circle_sort (int n, int s, int m, int *p)
输入:n 游戏总人数 s报数的起始编号 m报数的数值
输出:p 指向长度为n的数组,出圈次序保存在p指向的数组中
示例 n=7 s=2 m=3 出圈次序为:4 7 3 1 6 2 5
n=3 s=1 m=2 出圈次序为:2 1 3
#include<iostream>
using namespace std;
void circle_sort(int n,int s,int m,int *p);
int main()
{
int n,s,m;
int *p=new int[n];
cout << "输入游戏总人数、起始编号和报数数值:" ;
cin >> n >> s >> m;
circle_sort(n,s,m,p);
cin.get();
cin.get();
return 0;
}
void circle_sort(int n,int s,int m,int *p)
{
for(int i=0;i<n;i++)
*(p+i)=i+1;
int *end=p+n-1;
int *temp=p+(s+m-2)%n;
int n1=n,s1=s,m1=m;
while(n1)
{
cout<<*temp<<endl;
*temp=-1;
if(n1==1)
break;
while(m1)
{
if(temp==end)
temp=p;
else
temp++;
if(*temp!=-1)
m1--;
}
m1=m;
n1--;
}
}
2. 实现子串查找程序
问题描述:
判断一个字符串(dst)是否是另一个字符串(src)的子串;
输出子串在母串中的第一次出现的起始位置;
匹配的时候不区分大小写;
不能使用库函数(使用库函数按0分计算);
要求实现函数: unsigned int str_str(char * src, char *dst);
返回:如果dst是src的子串则返回起始位置
如果不是则返回0
输入:src 指向母串的指针; dst指向子串的指针
示例
src->akrsd5859 dst->rsd 则返回3
src->Rstsawerst36ds dst->rst 则返回1
src->dfsge dst-> dfsgesa 则返回0
法1:
#include<iostream>
using namespace std;
unsigned int str_str(char * src, char *dst);
int main()
{
char src[1024];
char des[1024];
cin>>src>>des;
cout<<str_str(src,des)<<endl;
return 0;
}
unsigned int str_str(char * src, char *dst)
{
unsigned int loc=0;
char *loc_point=0;
char *src_tmp=src;
char *dst_tmp=dst;
while(*src_tmp!='\0'&&*dst_tmp!='\0')
{
if(loc)//表示已经找到src和dst首位相同的位置
{
if(*src_tmp-*dst_tmp==32||*src_tmp-*dst_tmp==-32||*src_tmp-*dst_tmp==0)//表示相同,继续下一位匹配
{
src_tmp++;
dst_tmp++;
}else//表示不同,src_tmp指针回到两首位匹配的下一位.dst_tmp回到src首位.loc置为0;
{
src_tmp=loc_point+1;
loc=0;
loc_point=0;
dst_tmp=dst;
}
}else
{
if(*src_tmp-*dst_tmp==32||*src_tmp-*dst_tmp==-32||*src_tmp-*dst_tmp==0)
{ loc_point=src_tmp;
loc=src_tmp-src+1;
src_tmp++;
dst_tmp++;
}else
src_tmp++;
}
}
return loc;
}
法2:
#include<iostream>
#include<string>
using namespace std;
unsigned int FindStr(char* src, char* dst);
void main()
{
char src[1024];
char dst[1024];
gets(src);
gets(dst); //cin >> src >> dst;
int count = FindStr(src, dst);
cout<< count <<endl;
}
unsigned int FindStr(char* src, char* dst)
{
int len1 = strlen(src);
int len2 = strlen(dst);
for(int i=0; i<len1; i++)
{if(src[i]-dst[0]==32||src[i]-dst[0]==-32||src[i]-dst[0]==0)
{
int n=0;
n=i+1;
for(int j=1; j<len2; j++,n++)
if(src[n]-dst[j]!=32&&src[n]-dst[j]!=-32&&src[n]-dst[j]!=0)
break;
if(n-i==len2)
return i+1;
}
}
return 0;
}