您的位置:首页 > 编程语言 > C语言/C++

面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)

2015-08-08 21:52 471 查看
/*
求组合数: 求n个数(1....n)中k个数的组合....
如:combination(5,3)
要求输出:543,542,541,532,531,521,432,431,421,321,
*/

//方法1
#include <stdio.h>
#include<malloc.h>
int *a,n,k;;
int counts=0;
void  comb(int m,int k)
{
int i,j;
for (i=m;i>=k;i--)
{
a[k]=i;
if (k>1)
comb(i-1,k-1);
else
{
counts++;
for (j=a[0];j>0;j--)
printf("%d ",a[j]);
printf("\n");
}
}
}
void main()
{
printf("Please input n:");
scanf("%d",&n);
printf("Please input k:");
scanf("%d",&k);
a=(int*)malloc(sizeof(int)*(k+1));
a[0]=k;
comb(n,k);
printf("All kinds is:%d\n",counts);
}

//方法2
#include<stdio.h>
#include<malloc.h>
int n,k,*a;
void comb(int N,int K)
{
int i;
int cnt=k-K;
if(cnt<k)
{
for(i=N;i>=k-cnt;i--)
{
a[cnt]=i;
comb(i-1,K-1);
}
}
else
{
for(i=0;i<k;i++
4000
)
printf("%d ",a[i]);
printf("\n");
}
}
void main()
{
printf("Please input n:");
scanf("%d",&n);
printf("Please input k:");
scanf("%d",&k);
a=(int*)malloc(sizeof(int)*k);
comb(n,k);
}
/*
用指针的方法,将字符串“ABCD1234efgh”前后对调显示
*/
#include <stdio.h>
#include <string>
void main()
{
char str[]="ABCD1234efgh";
printf("原字符串:%s\r\n",str);
char temp;
int length;
length=strlen(str);
char *p1,*p2;
p1=str;
p2=(str+length-1);
int cnt=length/2;
while(cnt--)
{
temp=*p1;
*p1=*p2;
*p2=temp;
p1++;
p2--;
}
printf("倒置的字符串:%s\r\n",str);
}
/*
给定字符串A和B,输出A和B中的最大公共子串。比如A="aocdfe" B="pmcdfa" 则输出"cdf"
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *commanstring(char shortstring[],char longstring[])
{
int i,j;
char *substring =(char*) malloc(256);
if(strstr(longstring,shortstring)!=NULL)//shortstring完全在longstring中出现
//strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。
//char *strstr(char *str1, const char *str2);
//str1被查找目标 str2: 要查找对象
<span style="white-space:pre">	</span>return shortstring;
for(i=strlen(shortstring)-1;i>0;i--)//i复制的字符个数
{
for(j=0;j<=strlen(shortstring)-i;j++)//j控制从shortstring第几位开始复制
{
memcpy(substring,&shortstring[j],i);
//memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
//void *memcpy(void *dest, const void *src, size_t n);
substring[i]='\0';
if(strstr(longstring,substring)!=NULL)
return substring;
}
}
return NULL;
}

void main(void)
{
char *str1 = "aocdfe";
char *str2 = "pmcdfa";
char *comman = NULL;
if(strlen(str1)>strlen(str2))
comman= commanstring(str2,str1);
else
comman = commanstring(str1,str2);
printf("the longest comman string is:%s\n",comman);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 算法