- 约瑟夫环
题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int main(){
int n;
bool a[100]={0};
int s=0,t=0,f=0;
printf("Please enter the number of people:");
scanf("%d",&n);
do{
++t;
if(t>n){
t=1;//构成圈
}
if(!a[t]){
s++;//数活着的人的人数
}
if(s==3){
s=0;//计数清零
// printf("%d ",t);
a[t]=1;//杀死该序号的人
f++;//死的人数+1
if(f==n){
printf("The alive person is %d\n",t);
}
}
}while(f!=n);
system("pause");
return 0;
}
- 统计最长连续数字子串的个数及输出
#include<stdio.h>
#include<stdlib.h>
int continue_max_str(char *src)
{
int len=0;
int max_len=0;
char *p;
while(*src!='\0')
{
while((*src>='0'&&*src<='9')&&*src!='\0')
{
len++;
src++;
}
if(len>max_len){
max_len=len;
p=src-1;
}
len=0;//清零
src++;
}
int n=max_len;
do
{
--n;
printf("%c",*(p-n));
}while(n!=0);
printf("\n");
return max_len;
}
int main(int agrc,char *argv[])
{
char *src=(char *)malloc(sizeof(char)*100);//动态分配
printf("Please input src:\n");
scanf("%s",src);
int max_len=continue_max_str(src);
printf("The max len=%d\n",max_len);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int continue_max_str(char*dest,char *src)
{
int len=0;
int max_len=0;
while(*src!='\0')
{
while((*src>='0'&&*src<='9')&&*src!='\0')
{
len++;
src++;
}
if(len>max_len)
{
strncpy(dest,src-len,len);
*(dest+len)='\0';
max_len=len;
}
len=0;//清零
src++;
}
return max_len;
}
int main(int agrc,char *argv[])
{
char *src=(char *)malloc(sizeof(char)*100);//动态分配
char *dest=(char *)malloc(sizeof(char)*100);
printf("Please input src:\n");
scanf("%s",src);
printf("src=%s\n",src);
int max_len=continue_max_str(dest,src);
printf("The max len=%d\n",max_len);
printf("The dest=%s",dest);
system("pause");
return 0;
}
- 统计父串中子串的个数(strncmp)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 100
int count_sub_str(char *sub,char *src)
{
int count=0;
int s_len=strlen(sub);
while(*src !='\0')
{
if(strncmp(sub,src,s_len)==0)
{
count++;
src=src+s_len;
}
else
{
src++;
}
}
return count;
}
int main(int argc,char *argv[])
{
char *sub;
char src[MAX_SIZE];
printf("Please input src:\n");
// scanf("%s,src");
gets(src);
sub=(char *)malloc(sizeof(char)*MAX_SIZE);//动态分配
if(NULL==sub)
{
printf("malloc sub is error!\n");
exit(1);
}
printf("Please input sub:\n");
scanf("%s",sub);
// printf("%s\n%s\n",src,sub);
int count=count_sub_str(sub,src);
printf("sub str count = %d\n",count);
system("pause");
return 0;
}
- 编写一个函数,该函数给出一个字节被置为1的位的个数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int func (char ch)
{
int a;
int count;
for(int i=0;i<8;i++)
{
a=(ch>>i)&1;
if(a==1)
{
count++;
}
}
return count;
}
int main(int argc,char **argv)
{
char ch;
printf("input the ch:");
scanf("%c",&ch);
int result=func(ch);
printf("%d\n",result);
return 0;
return 0;
}
- 将整数型数据转为字符串
main.c
#include<stdio.h>
#include<stdlib.h>
#include"int2str.h"
int main(int argc,char **argv)
{
int num;
printf("Please input num:\n");
scanf("%d",&num);
char *result =int2str(num);
printf("result = %s\n",result);
system("pause");
return 0;
}
int2str.h
#include <stdio.h>
#include <string.h>
extern char * int2str(int num);
#define MAX_SIZE 1006
int2str.c
#include "int2str.h"
static void reverse_str(char *src)
{
if(NULL==src)
{
return;
}
char temp;
int len=strlen(src);
for(int i=0;i<=len/2;i++)
{
temp=*(src+i);
*(src+i)=*(src+len-1-i);
*(src+len-1-i)=temp;
}
return;
}
char * int2str(int num)
{
int i=0;
// char src[MAX_SIZE];
//不能返回局部变量
//解决方法:1.加 static 2.动态分配
static char src[MAX_SIZE];
while(num!=0)
{
src[i]=num%10+'0';
num=num/10;
i++;
}
src[i]='\0';
reverse_str(src);
return src;
}
- 编写一个C函数,将“I am from shanghai”倒置为“shanghai from am I”,即将句子中的单词倒置,而不改变单词内部结构。
main.c
#include <stdio.h>
#include <stdlib.h>
#include "reverse_str.h"
int main(int argc ,char *argv[])
{
char src[MAX_SIZE];
printf("Please input src(sentence):\n");
gets(src);
reverse_str(src,strlen(src));
reverse_word(src);
printf("src=%s\n",src);
return 0;
}
reverse_str.c
#include "reverse_str.h"
void reverse_str(char *src,int len)
{
if(NULL==src)
{
return;
}
char temp;
for(int i=0;i<len/2;i++)
{
temp=*(src+i);
*(src+i)=*(src+len-1-i);
*(src+len-1-i)=temp;
}
return;
}
reverse_str.h
#include <stdio.h>
#include <string.h>
void reverse_str(char *src,int len);
#define MAX_SIZE 1006
reverse_word.c
#include "reverse_word.h"
#include "reverse_str.h"
void reverse_word(char *src)
{
if(NULL==src)
{
return;
}
int len =0;
while(*src!='\0')
{
if(*src==' ')
{
reverse_str(src-len,len);
len=0;
}
else
{
len++;
}
src++;
}
reverse_str(src-len,len);
return;
}
reverse_word.h
#include <stdio.h>
#include <string.h>
void reverse_word(char *src);
#define MAX_SIZE 1006
- 编程实现将一个字符串中出现次数最少的字符删除
main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"count_ch.h"
#include "del_ch_min.h"
#define MAX_SIZE 1006
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("Please input string");
exit(1);
}
int count[26]={0};//'a'-'z'
char src[MAX_SIZE];
strcpy(src,argv[1]);
// printf("%s",src);
count_ch(src,count);
// for(int i=0;i<26;i++)
// {
// printf("%c:%d\n",'a'+i,count[i]);
// }
int min=get_min(count);
del_min_ch(min,count,src);
printf("src=%s\n",src);
}
get_min.c
int get_min(int *count)
{
int min=0;
for(int i=0;i<26;i++)
{
if(count[i]!=0)
{
min=count[i];
for(i=0;i<26;i++)
{
if((count[i]!=0)&&(count[i]<min))
{
min=count[i];
}
}
return min;
}
}
}
del_ch_min.c
void del_min_ch(int min,int *count,char *s)
{
char *temp;
while(*s!='\0')
{
if(count[*s-'a']==min)
{
temp=s;
while(*temp!='\0')
{
*temp=*(temp+1);
temp++;
}
}
else
{
s++;
}
}
}
count_ch.c
void count_ch(char*s,int *count)
{
while(*s !='\0')
{
count[*s-'a']++;
s++;
}
}