C语言学习笔记-经典例题记录1

一些测试时候的入门小习题,不做解说,有问题请评论

字符串逆序排列1

目录

一些测试时候的入门小习题,不做解说,有问题请评论

字符串逆序排列1

字符串逆序排列2

冒泡法比大小

迭代法求最大公约数

遍历法求素数(1-根号n)

求10个整数的最大值

有序数组查找数字

猜数字小游戏

递归计算斐波那契数列

迭代计算斐波那契数列

数组转置

青蛙跳台阶(递归)

汉诺塔(递归)


/*数组字符反向(递归)(1)*/
#include<stdio.h>
int num = 0;
int times = 1;
int reverse_string(char* string)
{
	char arr = '0';
	if (*string == '\0')
		return 0;
	else
	{
		times++;
		num = 1 + reverse_string(string + 1);
		times--;
	}
	if (times < num)
	{
		arr = *string;
		* string = *(string + num - times);
		*(string + num - times) = arr;
	}
	return num;
}

int main()
{
	char arr[] = "abcdef";
	printf("%s\n", arr);
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

字符串逆序排列2

/*数组字符反向(递归)(2)*/
#include<stdio.h>

int reverse_string(char* string)
{
	char arr;
	char* s;
	s = string;
	while (*s != '\0')
	{
		s++;
	}
	arr = *string;
	*string = *(s - 1);
	*(s - 1) = '\0';
	if(string<(s-2))//说明还有至少两个元素没有替换
		reverse_string(string + 1);
	*(s - 1) = arr;//之间*(s-1)替换'\n',现在替换回来,期间用arr保存
}

int main()
{
	char arr[] = "abcdef";
	printf("%s\n", arr);
	reverse_string(arr);
	printf("%s\n", arr);


	return 0;
}

冒泡法比大小

/*冒泡法比大小*/
#include <stdio.h>
#define LEN 3
void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
 void loopsort1(int len, int * arr)
{
    int i = 0,j = 0;
    for (i = 0; i < len - 1; ++i) {
        for (j = 0; j < len - 1 - i; ++j) {
            if ( arr[j]  > arr[j+1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}
int main()
{
    int arr[LEN] = { 0 };
    int len = 0, i ,j;
    len = sizeof(arr) / sizeof(*(arr));
    for (i = 0; i < len; ++i)
    {
        scanf("%d", arr + i);
    }
    loopsort1(len, arr);
    for (j = len - 1; j >= 0; --j)
    {
        printf("%d ", arr[j]);
    }

    return 0;
}

迭代法求最大公约数

/*求两个数的最大公约数*/
#include<stdio.h>

void swap(int* a, int* b)//定义指针变量,表明这个变量指向地址,形参为a并非*a
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main()
{
	int num1 = 0, num2 = 0, temp = 0;
	scanf("%d %d", &num1,&num2);
	if (num1 < num2)
	{
		swap(&num1, &num2);
	}
	temp = num1 % num2;
	while(temp!=0)
	{
		num1 = num2;
		num2 = temp;
	    temp = num1 % num2;
	}
	printf("最大公约数为%d\n",num2);

	return 0;
}

遍历法求素数(1-根号n)

/*打印素数*/
#include<stdio.h>
#include<math.h>
int primenum(int a)
{
	int k=0,i=0;
	k = (int)sqrt((double)a) + 1;
	for (i = 2; i < k; i++){
		if (a % i == 0)
			return 0;
	}
	return 1;
}
int main()
{
	int i = 100,a=0;
	printf("打印100~200之间的素数:\n");
	
	for (i = 100; i <= 200; ++i){
		if (primenum(i) == 1){
			printf("%-4d", i);
			a++;
			if (a % 10 == 0) {
				printf("\n");
				a = 0;
			}
		}
	}
	return 0;
}

字符的向中移动

/*延时字符的两端向中间移动*/
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
	char arr1[] = "hello bite!";
	char arr2[] = "###########";
	int size = 0;
	int left = 0, right = 0, i = 0;
	size = sizeof(arr2) / sizeof(arr1[0]);//size=strlen(arr1);//用sizeof包含了\n strlen不包括\n
	right = size - 2;
	while (left <= right)
	{
	printf("%s", arr2);
	arr2[left] = arr1[left];
	arr2[right] = arr1[right];
	sleep(1000);//vs提供的函数,单位为ms
	system("cls");
	left++;
	right--;
	}
	return 0;
}

求10个整数的最大值

/*求10整数中的最大值*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

int loop(int* arr,int n,int *p1)//arr为数组首地址,n为数组元素数量,num
{
	int i=0;
	int max = 0;
	int flag=0;
	for (i =0;i<n-1;i++){ 
		if (arr[i] > arr[i + 1]){
			arr[i + 1] = arr[i];
			flag++;//判断右边是否连续小于左边
			if (flag == 1) {
				*p1 = i;//右边小于左边,指针固定为左边
			}
			else;	
		}else {
			*p1 = i + 1;//右边大于左边,指针右移
			flag = 0;
		}
	}
	return arr[9];//返回最大值
}

int main()
{
	int *num = 0;//数组下标
	int* p = &num;//指向数组下标的指针
	int arr1[10] = {0};//存储随机数的数组
	int i = 0;
	int max = 0;//最大值
	int ch = 0;//读取getchar
	srand((unsigned)time(NULL));
	while ((ch=getchar())!=EOF)//循环测试 ctrl+Z结束
	{
		for (i = 0; i < 10; ++i)
		{
			arr1[i] = rand() % 100;
			printf("arr[%d]=%-4d", i, arr1[i]);
			if (i == 9)
				printf("\n");
		}//打印随机数组
		max = loop(arr1, 10, p);//利用loop函数进行数组最大值及对应下标读取
		printf("最大值是arr[%d],数值是%4d\n", num, max);//打印最大值及其对应下标;
		Sleep(500);//休眠500ms
	}
		return 0;
}

有序数组查找数字

/*对有序数组进行二分法查找*/
#include<stdio.h>
#include<string.h>

int main()
{
	int left = 0, right = 0, num = 0, i = 0, size = 0, mid = 0;
	int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	char ch = 0;
	size = sizeof(arr) / sizeof(arr[0]);
	right = size -1;
	for (i = 0; i < size; i++)
	{
		printf("arr[%2d]=%-2d  ", i, arr[i]);
		if (i == (size-1) / 2)
			printf("\n");
		if (i == size - 1)
			printf("\n数组长度为 %d  \n", size);
	}
	printf("请输入要查找的数:\n");
	scanf("%d", &num);
	while (1)
	{
		while (left <= right)
		{
			mid = (left + right) / 2;
			if (arr[mid] > num)
			{
				right = mid - 1;
			}
			else if (arr[mid] < num)
			{
				left = mid + 1;
			}
			else if (arr[mid] == num)
			{
				printf("找到了,下标是%d\n", mid);
				break;
			}
		}
		if (left > right)
			printf("找不到\n");
		right = size - 1;
		left = 0;
		printf("请输入要查找的数:\n");
		scanf("%d", &num);
		if (num == 999)
			break;
	}
	return 0;
}

猜数字小游戏

/*猜数字小游戏*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>

void meun1(void)
{
	printf("***********************************\n");
	printf("********** Guess Number!**********\n");
	printf("***********************************\n");
	printf("***********   1.Enter   ***********\n");
	printf("***********   2.Exit    ***********\n");
	printf("***********************************\n");
}

void meun2(void)
{
	printf("***********************************\n");
	printf("********** Guess Number!**********\n");
	printf("***********************************\n");
	printf("*******Pleses Input Number!*******\n");
}

void meun3(void)
{
	printf("***********************************\n");
	printf("***********  1.Continue ***********\n");
	printf("***********  2.Exit     ***********\n");
	printf("***********************************\n");
}

char game(void) 
{
	int select = 0;
	do
	{
		int input = 0;
		int temp = 0;
		char tem = '0';
		Sleep(800);//延时800ms
		system("cls");//清空显示界面
		meun2();
		int result = (int)rand() % 100 + 1;//确保每次进入循环数值都是随机的
		do
		{
			temp=scanf("%d", &input);
			while ((tem = getchar()) != '\n');//清空缓冲区
			{
				;//空语句
			}
			if (temp==1&&input <= 100 && input >= 0)
			{
				if (input < result)
				{
					printf("猜小了\n");
					continue;
				}
				else if (input > result)
				{
					printf("猜大了\n");
				}
				else if (input == result)
				{
					int ret = 0;
					printf("********** 恭喜你猜对了!**********\n");
					Sleep(800);//延时800ms

					do
					{
						system("cls");//清空显示界面
						meun3();
						scanf("%d", &select);
						switch (select)
						{
						case 1:
							ret = 1;
							break;
						case 2:
							return '2';
						default:
							printf("输入错误请重试\n");
							Sleep(800);//延时800ms
							continue;
						}
					} while (ret==0);
					break;
				}
			}
			else
			{
				printf("非法输入!\n");
				break;
			}
		} while (1);

	} while (1);
}

int main()
{
	char ch = '0';
	srand((unsigned int)time(NULL));//利用time获取时间戳给srand播种随机数
	do
	{
		char temp='0';
		meun1();
		ch = getchar();
		if (temp = getchar() != '\n')
		{
			printf("输入错误请重试\n");
			while ((temp= getchar()) != '\n');//清空缓冲区
			{
				;//空语句
			}
			Sleep(800);//延时800ms
			system("cls");//清空显示界面
			ch = '0';//防止跳出循环
			continue;
		}

		switch (ch)
		{
		case '1':
			
			printf("游戏开始\n");
			ch=game();
			break;
		case '2':
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误请重试\n");
			Sleep(800);//延时300ms
			system("cls");//清空显示界面
			break;
		}
	} while (ch != '2');

	return 0;
}

递归计算斐波那契数列

/*计算斐波那契数列(递归)*/
#include<stdio.h>
int count = 0;
int a = 0;
int b = 1;
int temp = 0;
int fac(int n)
{
	if (n == 1)
	{
		return a;
	}
	else
	{
		if (n == 2)
			return b;
		
		return fac(n - 1) + fac(n - 2);
	}
}

int main()
{
	int rez = 0;
	int n = 0;
	scanf("%d", &n);
	printf("%d",fac(n+1));//此次计算数列从0开始
	return 0;
}

迭代计算斐波那契数列

/*计算斐波那契数列(非递归)*/
#include<stdio.h>
int fac(int n)
{
	int a = 1;
	int b = 1;
	int temp = 0;
	int i = 0;
	if (n <= 2)
		return 1;
	for(i=3;i<=n;++i)
	{
		temp = a + b;
		a = b;
		b = temp;
	}
	return b;
}

int main()
{
	int rez = 0;
	int n = 0;
	scanf("%d", &n);
	rez = fac(n);
	printf("%d", rez);
	return 0;
}

数组转置

/*数组转置*/
#include<stdio.h>
int main()
{
	int m = 5;
	int n = 2;
	float a[5][2] = { {0} ,{0} };
	float b[2][5] = { {0} ,{0} };
	for (m = 0; m < 5; ++m)
	{
		for (n = 0; n < 2; ++n)
		{
			scanf("%f", &a[m][n]);
			b[n][m] = a[m][n];
		}
	}
	printf("数组a:\n");
	for (m = 0; m < 5; ++m)
	{
		for (n = 0; n < 2; ++n)
		{
			printf("%4.2f  ", a[m][n]);
		}
		printf("\n");
	}
	printf("数组b:\n");
	for (n = 0; n < 2; ++n)
	{
		for (m = 0; m < 5; ++m)
		{
			printf("%4.2f  ", b[n][m]);
		}
		printf("\n");
	}
	return 0;
}

青蛙跳台阶(递归)

/*青蛙跳台阶*/
#include<stdio.h>
#include<stdlib.h> 
#include<memory.h>
int num = 0;
int times = 0;
int fac(int n,int *arr)
{
	if (n == 1)
	{
		num++;//可以作为次数
		*arr = 1;
		return 1;
	}
	else if (n == 2)
	{
		*(arr+1) =1+ fac(1,arr);
		num += 2;//可以作为次数
		return 1 + fac(1,arr);
	}
	else
	{
		if ((*(arr + n - 1)) == 0)
		{
			*(arr + n - 1) = fac(n - 1, arr) + fac(n - 2, arr);
			return *(arr + n - 1);
		}//如果执行过这次函数对应位置就不会为0,可以直接出结果不用递归\
       空间复杂度加n 时间复杂度减少,具体待计算 
		else
			return *(arr + n -1);
	}
}

int main()
{
	int n = 0;
	int *arr;
	scanf("%d", &n);
	getchar();
	arr = (int*)malloc((n+1) * (sizeof(int)));//申请一个n长度的内存地址
	memset(arr, 0,4*(n+1));//清空数组 按照字节清空
	printf("%d\n", fac(n, arr));
	free(arr);//释放内存
	return 0;
}

汉诺塔(递归)

#include<stdio.h>
int i = 0;
void hanoi(int n,char a,char b,char c)//a原始 b目标 c辅助(这个函数就是在\
                                     最后只有一个棋子的时候输出a->b,这\
                                     时侯的a->b并不是真正的a,b柱,二十\
                                     代表了一种操作,这种操作由printf表示
{
    i++;
    if (n == 1)
        printf("%c->%c\n", a, b);
    else
    {
        hanoi(n - 1, a, c, b);//n-1个全部挪到辅助柱上
        printf("%c->%c\n", a, b);//第n个从原始挪到目标柱
        hanoi(n - 1, c, b, a);//将n-1全部从辅助挪到目标柱子
    }
}

int main()
{
    int n = 0;
    char a = 'a';
    char b = 'b';
    char c = 'c';
    scanf("%d", &n);
    hanoi(n, a, b, c);
    printf("\n%d", i);
    return 0;
}

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值