1.实现一个函数,可以左旋字符串中的k个字符。 ABCD左旋一个字符得到BCDA ,ABCD左旋两个字符得到CDAB 。
解题思路:左旋字符串,可以先将第一个字符和最后一个字符交换,然后进行循环,就可以解决这个问题了。
#include <stdio.h>
#include<assert.h>
#include<string.h>
void Left_Reverse(char* ptr,int sz,int key){
assert(ptr);
int i = 0;
int j = 0;
for(i = 0;i < key;i++){
char tmp = ptr[0];
for(j = 0;j < sz-1;j++)
ptr[j] = ptr[j+1];
ptr[sz-1] = tmp;
}
}
int main(){
char arr[] = "ABCD";
int key = 0;
int sz = strlen(arr);
printf("请输入要左旋的字符数:");
scanf("%d",&key);
Left_Reverse(arr,sz,key);
printf("%s\n",arr);
return 0;
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解题思路:这里我们采用的方法是将字符串1每旋转一次,就与字符串2做一次比较。
#include <stdio.h>
#include<string.h>
int Judge(char arr1[],char arr2[]){
int i,j;
int len = strlen(arr1);
char tmp;
for(i = 0;i < len;i++){
tmp = arr1[0];
for(j = 0;j < len-1;j++)
arr1[j] = arr1[j+1];
arr1[len-1] = tmp;
if(strcmp(arr1,arr2) == 0){
printf("是旋转之后的字符串\n");
return 1;
}
}
printf("不是旋转之后的字符串\n");
return 0;
}
int main(){
char arr1[10],arr2[10];
printf("请输入两个字符串:");
scanf("%s %s",arr1,arr2);
int ret = Judge(arr1,arr2);
printf("ret = %d\n",ret);
return 0;
}
3.递归和非递归分别实现求第n个斐波那契数。
(1)递归版本:
#include <stdio.h>
int fib(int n){
if(n <= 2)
return 1;
return fib(n-1)+fib(n-2);
}
int main(){
int n = 0;
printf("please enter a number:");
scanf("%d",&n);
int ret = fib(n);
printf("fib(%d) = %d\n",n,ret);
return 0;
}
(2)非递归版本:
#include <stdio.h>
int fib(int n){
int first = 0;
int second = 1;
int fb = 0;
int i = 0;
if(n <= 2)
return 1;
else{
for(i = 2;i < n+1;i++){
fb = first + second;
first = second;
second = fb;
}
}
return fb;
}
int main(){
int n = 0;
printf("please enter a number:");
scanf("%d",&n);
int ret = fib(n);
printf("fib(%d) = %d\n",n,ret);
return 0;
}
4.编写一个函数实现n^k,使用递归实现
#include <stdio.h>
int power(int n,int k){
if(k == 0)
return 1;
else
return n*power(n,k-1);
}
int main(){
int n,k;
printf("please enter two data:");
scanf("%d%d",&n,&k);
printf("%d^%d = %d\n",n,k,power(n,k));
return 0;
}
5. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#include <stdio.h>
int DigitSum(int n){
if(n < 10)
return n;
else
return n%10+DigitSum(n/10);
}
int main(){
int n = 0;
printf("please enter the number:");
scanf("%d",&n);
printf("DigitSum(%d) = %d\n",n,DigitSum(n));
return 0;
}
6. 编写一个函数reverse_string(char * string)(递归实现) ,实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。
#include <stdio.h>
#include<assert.h>
void reverse_string(char* string){
assert(string);
if(*string != '\0'){
string++;
reverse_string(string);
printf("%c",*(string-1));
}
}
int main(){
char* string = "hello world";
printf("原字符串为:%s\n",string);
reverse_string(string);
printf("\n");
return 0;
}
7.递归和非递归分别实现strlen
(1)递归版本:
#include <stdio.h>
#include<assert.h>
int my_strlen(char* string){
assert(string);
int count = 0;
if(*string != '\0'){
string++;
count = my_strlen(string)+1;
}
return count;
}
int main(){
char arr[20];
printf("please enter string:");
scanf("%s",arr);
printf("length of string = %d\n",my_strlen(arr));
return 0;
}
(2)非递归版本:
#include <stdio.h>
int my_string(char* string){
int count = 0;
while(*string != '\0'){
count++;
string++;
}
return count;
}
int main(){
char arr[20];
printf("please enter string:");
scanf("%s",arr);
printf("the length of string is %d\n",my_string(arr));
return 0;
}
8.递归和非递归分别实现求n的阶乘
(1)递归版本:
#include <stdio.h>
int facl(int n){
if(n == 0 || n == 1)
return 1;
else
return n*facl(n-1);
}
int main(){
int n = 0;
printf("please enter a number:");
scanf("%d",&n);
printf("facl(%d) = %d\n",n,facl(n));
return 0;
}
(2)非递归版本:
#include <stdio.h>
int facl(int n){
if(n == 0 || n == 1)
return 1;
else{
int value = 1;
int i = n;
for(;i > 1;i--){
value *= n;
n--;
}
return value;
}
}
int main(){
int n = 0;
printf("please enter a number:");
scanf("%d",&n);
printf("facl(%d) = %d\n",n,facl(n));
return 0;
}
9.递归方式实现打印一个整数的每一位
#include <stdio.h>
void print(int n){
if(n > 9)
print(n/10);
printf("%d ",n%10);
}
int main(){
int n = 0;
printf("please enter a number:");
scanf("%d",&n);
print(n);
printf("\n");
return 0;
}