从0开始学c语言-过渡-函数递归、循环语句、数组练习

上一篇:从0开始学c语言-17-二维数组以及数组传参应用:三字棋_阿秋的阿秋不是阿秋的博客-CSDN博客

 

目录

题目一:二分查找

题目二:数9的个数

思路:

题目三:分数求和

题目四:求最大值

思路:

题目五:乘法口诀表

题目六:字符串逆序(递归实现)

非递归

递归实现-用自己求长度的函数

递归实现-用自带的strlen

题目七:计算一个数的每位之和(递归实现)

非递归的代码

换成递归的

题目八:递归实现n的k次方

考虑负数

题目九:交换数组


题目一:二分查找

编写代码在一个整形有序数组中查找具体的某个数

要求:找到了就打印数字所在的下标,找不到则输出:找不到。

int er(int q[], int w, int e)
{
	int left = 0;
	int right = e;
	int mid = (left + right) / 2;
	while (left <= right)
	{
		if (w < q[mid])
		{
			right = mid - 1;
			mid = (left + right) / 2;
		}
		else if (w > q[mid])
		{
			left = mid + 1;
			mid = (left + right) / 2;
		}
		else
			return mid;
	}
	return -99;
	
}
int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; //查找范围
	int b = 0;
	scanf("%d", &b); //输入查找值,别忘了&
	int c = sizeof(a) / sizeof(a[0]);  //数组元素个数
	printf("%d\n", er(a, b, c));
	return 0;
}

题目二:数9的个数

编写程序数一下 1到 100 的所有整数中出现多少个数字9

思路:

给一个循环从1遍历到100,拿到每个数据后进行一下操作:

1. 通过%的方式取当前数据的个位,检测个位数据是否为9,如果是,给计数器加1。
2. 通过/的方式取当前数据的十位,检测十位数据是否是9,如果是,给计数器加1。
循环一直继续,直到所有的数据检测完,所有9的个数已经统计在count计数中。

#include <stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 10 == 9) //个位数
			count++;
		if (i / 10 == 9) //十位数
			count++;
	}
	printf("%d\n", count);
	return 0;
}

题目三:分数求和

计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

观察出来奇数项为正数,偶数项为负数,且需要打印的是分数,那么就是需要输出小数结果,在进行除法运算的时候需要记得除法操作符的特点

不知道的看从0开始学c语言-07-认识一下操作符、原码和反码和补码_阿秋的阿秋不是阿秋的博客-CSDN博客

int main()
{
	int i = 0;
	double sum = 0; //和
	for (i = 1; i < 101; i++)
	{
		if (i % 2 != 0)
		{
			sum = sum + (1.0 / i); //用1.0是为了让除法进行小数运算
		}
		else
		{
			sum = sum - (1.0 / i);
		}
	}
	printf("%lf\n", sum);
	return 0;
}

或者优化一下代码

#include <stdio.h>
int  main()
{
	int i = 0;
	double sum = 0.0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum += flag * 1.0/ i;
		flag = -flag;
	}
	printf("%lf\n", sum);
	return 0;
}

题目四:求最大值

求10 个整数中最大值

思路:

1. 采用循环的方式输入一个数组
2. 使用max存储数组中的最大值,采用循环的方式依次获取数组中的每个元素与max进行比较,如果arr[i]大于max,更新max储存的最大值,数组循环结束后,max中保存的即为数组中的最大值。

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int max = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	max = arr[0];
	for (i = 1; i < 10; i++)
	{
		if (arr[i] > max)
			max = arr[i];
	}
	printf("max = %d\n", max);
	return 0;
}

题目五:乘法口诀表

在屏幕上输出9*9乘法口诀表

int main()
{
	int a = 0;
	int b = 0;
	for (a = 1; a < 10; a++)
	{
		for (b = 1; b < a + 1; b++)
		{
			printf("%d * %d  ", a, b);
		}
		printf("\n");
	}
	return 0;
}

 还少了结果

int main()
{
	int i = 0;
	//控制行数
	for (i = 1; i <= 9; i++)
	{
		//打印每一行内容,每行有i个表达式
		int j = 0;
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%2d ", i, j, i * j); //%2d代表打印两位,不够用空格填充
		}
		printf("\n");
	}
	return 0;
}

题目六:字符串逆序(递归实现)

非递归

//void re_sequence(char arr2[], int sz) 这样写也行
void re_sequence(char* arr2, int sz)
{
	int left = 0;
	int right = sz - 2; //sz-1是\0的下标
	while (left <= right)
	{
		char tmp = arr2[left]; 
		arr2[left] = arr2[right];
		arr2[right] = tmp;
//这样写也行
		//char tmp = *(arr2 + left); 
		//*(arr2 + left)=*(arr2+right);
		//*(arr2 + right) = tmp;

		left++;
		right--;
	}
}
int main()
{
	char arr1[] = "abcdef";  //此时arr中有六个元素,别忘了结束标志\0
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	re_sequence (arr1 ,sz);
	printf("%s\n", arr1);
	return 0;
}

递归实现-用自己求长度的函数

//我们用了自己写的求长度函数
int my_str(char*arr)
{
	int count = 0;
	while (*arr != '\0') //每次访问的都是首元素
	{
		count++; //统计长度
		arr++; //相当于换了下一个元素作为首元素
	}
	return count;
}

void re_seq(char* arr)
{
	char tmp = *arr;
	int len = my_str(arr); //如果不存在len中,输出结果是fea
	*arr= *(arr + len - 1);
	*(arr +len - 1) = '\0';
	if ((my_str(arr+1)) >=2)
	{
		re_seq(arr+1);
	}
	*(arr + len - 1) = tmp;
}
//为什么要把长度存在变量中呢?
//因为接下来的每一步我们都调用求长度函数的话
//就会导致每次长度求的不一样
//所换的数据也就不一样了
//这就是为什么要设置个变量来接收长度的原因了

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

递归实现-用自带的strlen

void reverse_string(char* arr)
{
	int len = strlen(arr);
	char tmp = *arr;
	*arr = *(arr+len-1);
 //在最后那个位置放上\0进行递归
	*(arr+len-1) = '\0';
	if(strlen(arr+1)>=2)
		reverse_string(arr+1);
 //交换完之后再把之前存的都放回\0的位置上
	*(arr+len-1) = tmp;
}

题目七:计算一个数的每位之和(递归实现)

输入一个非负整数,返回组成它的数字之和

非递归的代码

int add(int a)
{
	if (a > 9)
	{
		a = a % 10 + add(a / 10);
	}
	return a;
}

int main()
{
	int input = 0;
	scanf("%d", &input);
	printf("%d",add(input));
	return 0;
}

换成递归的

int ret(int n)//1729
{
	if(n>9)
		return ret(n/10)+n%10;
	else
		return n;
}

题目八:递归实现n的k次方

int re(int n, int k)
{
	if(k==0)
		return 1;
	else if(k>=1)
	{
		return n*re(n, k-1);
	}
}

这是基本思路,但是没有考虑到负数,我们完善一下。

考虑负数

double squ(int n,int k) //因为后面有1.0的小数运算
{
	if (k > 0)
	{
		return n * squ(n, k - 1);
	}
	else if (k == 0)
		return 1;
	else
		return 1.0 / squ(n, -k); //2的-3次方,那这里就是2的3次方分之一
}
int main()
{
	printf("请输入需要求的n的k次方所对应的n的值");
	int n = 0;
	scanf("%d", &n);
	printf("请输入需要求的%d的k次方所对应的k的值", n);
	int k = 0;
	scanf("%d", &k);
	printf("%lf",squ(n,k));
	return 0;
}

题目九:交换数组

将数组A中的内容和数组B中的内容进行交换。(数组一样大)

注意:交换数组不能创建中间数组进行交换。

#include <stdio.h>


int main()
{
	int arr1[10] = {0};
	int arr2[10] = {0};
	int i = 0;
//初始化两个数组
	printf("请输入10个数字:>");
	for(i=0; i<10; i++)
	{
		scanf("%d", &arr1[i]);
	}
	printf("请输入10个数字:>");
	for(i=0; i<10; i++)
	{
		scanf("%d", &arr2[i]);
	}

	//交换
	for(i=0; i<10; i++)
	{
		int tmp = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = tmp;
	}
	
	return 0;
}

下一篇:从0开始学c语言-18-操作符详解_阿秋的阿秋不是阿秋的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值