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; }