C语言基础代码(6)

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





猜你喜欢

转载自blog.csdn.net/cecilia3333/article/details/79962927