C语言经典题型(一)

一、求两个数的最大值

1.1条件操作符

 #include <stdio.h>
int max(int x, int y)
{
	return x > y ? x : y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = max(a,b);
	printf("%d", ret);
	return 0;
}

扩展:用条件操作符求三个数的最大值

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d", &a, &b,&c);
	printf("%d",(a > b ? a : b) > c ? (a > b ? a : b) : c);
	return 0;
}

思路:核心逻辑是把三个数的求最大值转换为求两个数的最大值
本题则是通过三目操作符求出a和b的最大值,再拿这个值与c进行比较

1.2 选择语句

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > b)
	{
		printf("%d", a);

	}
	else
	{
		printf("%d", b);
	}
	return 0;
}

1.3 扩展,求十个数的最大值----数组

int main()
{
	int arr[10] = {0};
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);

	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);
	}

	int max = arr[0];

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

二、拷贝字符串

2.1 全部拷贝进去

#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[] = "abcedf";
	char ch2[20] = { 0 };
	strcpy(ch2, ch1);
	printf("%s", ch2);
	char* ret = strcpy(ch2, ch1);
    printf("%s\n", ret);

	return 0;
}

2.2 局部拷贝

#include <stdio.h>
int main()
{
	char ch1[] = "abcedf";
	memset(ch1, '*',5);
	printf("%s", ch1);

	return 0;
}

三、交换两个整型变量的内容

3.1 需要一个媒介–temp

#include <stdio.h>
int change(int* x, int* y)
{
	int temp = 0;
	temp = *x;
	*x = *y;
	*y = temp;
	printf("%d %d\n", *x, *y);
}
int main()
{
	int a = 3;
	int b = 5;
	printf("%d %d\n", a, b);
	change(&a, &b);
	return 0;
}

3.1.1 扩展—冒泡排序

题目:将5,3,7,6,9这一串数字排序
思路:
假如一共有n个数字,那我是要进行n-1次比较的,因为把大的排到后面之后,剩下的那个自然是最小的,不需要再一次排序。
而在我比较的那一趟数中,我要从第一个数开始,与相邻的进行比较,但是比完一次之后,要比的数字就会少一个,因为那个刚刚比较好的那个数字已经找到了自己的正确位置,下一次的比较不需要把它算上

#include <stdio.h>
void sort(int* arr[], int x)
{
	int i = 0;
	for (i = 0; i < x-1; i++)
	{
		int j = 0;
		for (j = 0; j < x - 1-i; j++)
		{
			int temp = 0;
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

}
int main()
{
	int arr[] = { 5,3,7,6,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	sort(arr, sz);

	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

3.2加减法

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 5;
	printf("%d %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("%d %d\n",a,b);
	return 0;
}

3.3 异或操作符(仅做了解)

因为可读性差,只能应用于整数而且效率没有3.2好,所以仅仅作为了解

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	printf("%d %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d\n", a, b);
	return 0;
}

四、求数

与函数那边结合,常常会出现一个逻辑,如果满足这个条件,就返回什么

注意判断里面的if是函数的返回值

4.1 求素数(100-200之间)

#include <stdio.h>
#include <math.h>
int is_leap_number(int x)
{
	int i = 0;
	for (i = 2; i <= sqrt(x); i++)
	{
		if (x % i == 0)    //如果一直到平方根那边都没有办法被除
		{                  //那后面大概率也不会被整除
			return 0;
		}
	}
	return 1;
}
int main()
{
	//是素数就返回1,不是返回0
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		if (is_leap_number(i) == 1)      //直接用返回值判断是不是素数
		{
		printf("%d ", i);
		}
	}
	return 0;
}

4.2 判断一个数是不是闰年

4.1 return 1/0 的法子

#include <stdio.h>
int is_leap_year(int x)
{
	if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
	{
		return 1;
	}
	else
		return 0;
}
int main()
{
	//是闰年返回1,不是返回0
	int i = 0;
	for (i = 1000; i <= 2000; i++)
	{
		int ret = is_leap_year(i);
		if (ret == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

ps:额外的return方法
表达式如果是真,返回的就是1,其实不需要多此一举

return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));

4.2.2 利用布尔类型

#include <stdio.h>
#include <stdbool.h>      //布尔类型需要引用的头文件
bool is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
		return true;
	else
		return false;
}

int main()
{
	if (is_leap_year(2048))
	{
		printf("是闰年\n");
	}
	else
	{
		printf("不是闰年\n");
	}

	return 0;
}

bool也可以写成_Bool

五、数组方面的查找

活用下标

5.1 一个整型有序数组的二分查找

#include <stdio.h>
int search(int* arr,int x,int y)
{
	int left = 0;
	int right = x - 1;
	while (left <= right)
	{
		int middle = (left + right) / 2;
		if (arr[middle] < y)
		{
			left = middle + 1;

		}
		else if (arr[middle] > y)
		{
			right = middle - 1;

		}
		else if (arr[middle] == y)
		{
			return middle;
		}

	}
	return 0;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int k = 0;
	scanf("%d", &k);
	int ret = search(arr,len,k);
	if (ret != 0)
	{
		printf("找到了,下标是%d", ret);
	}
	else
		printf("没有这个数");
	return 0;
}

注意事项:
求数组的长度必须要在main函数里面,因为传过去的是首元素地址,放在调用函数里面求,结果是1

注意,middle是小标,arr[middle]是该下标对应的数值

六、每调用一次函数,增加1

#include <stdio.h>
int Add(int* num)
{
	return *num  += 1;   //不能写成*num+1
}
int main()
{
	int num = 0;
	Add(&num);
	printf("%d\n", num);
	Add(&num);
	printf("%d\n", num);
	Add(&num);
	printf("%d\n", num);
	return 0;
}

七、按顺序打印一个数的每一位

用%和/这个操作

7.1 正序,递归写法

void Print(unsigned int n)
{
	if (n > 9)    //控制在十位数
	{
		Print(n/10);
	}
	printf("%d ", n % 10);
}

int main()
{
	unsigned int num = 0;
	scanf("%u", &num);
	Print(num);
	return 0;
}

为什么这边不能用while:
递归是通过自己调用自己,从而省去一些动作的函数,可以理解为好几个这个函数要执行,只不过里面所传的数值hi不一样的。
如果输入12,确实会在第二个调用函数中打印出来一,然后回到第一个递归,n是12,因为while,它是没有办法退出程序的,然后就又是传进去12,然后与之前一样的循环,从而循环打印1

结论
while里面不能放递归,很容易死循环,如果递归要与循环结合,循环只能是作为限制数的作用

7.2 倒叙,迭代写法

#include <stdio.h>
void Print(unsigned int n)
{
	while (n)       //控制在个位数,当个位数都没有的时候,就会退出循环
	{
		printf("%d ", n % 10);
		n = n / 10;
	}
}
int main()
{
	unsigned int num = 0;
	scanf("%u", &num);
	//写一个函数打印num的每一位
	Print(num);
	return 0;
}

八、自定义函数实现strlen函数的效果

8.1 计数器

#include <stdio.h>
int is_my_strlen(char* ch)
{
	int count = 0;
	while (*ch != '\0')
	{
		count++;
		*ch++;    //这边涉及了指针
	}
	return count;
}
int main()
{
	char ch[] = "abcdef";
	int ret = is_my_strlen(ch);
	printf("%d", ret);
	return 0;
}

8.2 递归写法

#include <stdio.h>
int is_my_strlen(char* ch)
{
	if (*ch != '\0')
	{
		return 1 + is_my_strlen(ch + 1);
	}
	else
	{
		return 0;
	}
}
int main()
{
	char ch[] = "abcdef";
	int ret = is_my_strlen(ch);
	printf("%d", ret);

	return 0;
}

8.3 指针

//int my_strlen(char* str)
//{
//	char* start = str;
//	while (*str != '\0')
//	{
//		str++;
//	}
//	return str - start;
//}
int my_strlen(char* str)
{
	char* start = str;
	while (*str++ != '\0')
		;
	return str - start - 1;
}


int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);

	printf("%d\n", len);
	return 0;
}

九、求阶乘

9.1 迭代写法

#include <stdio.h>
int mul(int x)
{
	int i = 0;
	int ret = 1;
	for (i = 1; i <= x; i++)
	{
		ret *= i;
	}
	return ret;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = mul(n);
	printf("%d", ret);
	return 0;
}

9.2 递归写法

#include <stdio.h>
int mul(int x)
{
	if (x >= 2)
	{
		return x * mul(x - 1);
	}
	else
	{
		return 1;
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = mul(n);
	printf("%d", ret);
	return 0;
}

十、求第n个斐波那契数列

10.1 交换值求(迭代)

#include <stdio.h>
int Fib(int x)
{
	int a = 1;
	int b = 1;
	int c = 1;
	int temp = 0;
	while (x>2)
	{
		c = a + b;
		temp = a;
		a = b;
		b = c;
		x--;
	}
	return c;
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = Fib(num);
	printf("%d", ret);
	return 0;
}

10.2 递归

#include <stdio.h>
int Fib(int x)
{
	if (x == 1 || x == 2)
	{
		return 1;
	}
	else
	{
		return Fib(x - 1) + Fib(x - 2);
	}
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = Fib(num);
	printf("%d", ret);
	return 0;
}

十一、打印乘法口诀表

int main()
{
	int i = 0;
	int line = 0;
	scanf("%d", &line);
	for (i = 1; i <= line; i++)
	{
		//打印一行
		int j = 0;
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d ", i, j, i * j);
		}
		printf("\n");
	}

	return 0;
}

十三、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值

13.1 每次循环就换符号

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

	return 0;
}


13.2 根据奇偶来判断

int main()
{
	int i = 0;
	double sum = 0.0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		if(i%2==1)
			sum = sum +  (1.0 / i);
		else
			sum = sum - (1.0 / i);
	}
	printf("%lf\n", sum);

	return 0;
}
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯并按条件打印笑脸 11.经典兔子问题 12.判断素数 13.水仙花数问题 14.正整数分解质因数 15.学习成绩划分 16.正整数求其最大公约数和最小公倍数 17.统计英文字母/空格/数字个数 18.求s=a+aa+aaa+aa...a的值 19.求解"完数" 20.球体自由落下物理问题 21.猴子吃桃问题 22.乒乓球比赛抽签问题 23.打印菱形图案 24.分数数列求和 25.求1+2!+3!+...+20!的和 26.利用递归方法求5! 27.将输入字符以相反顺序打印 28.岁数问题 29.求解正整数位数 30.判断回文数 31.星期几猜测游戏 32.改变文本颜色 33.学习gotoxy()与clrscr()函数 34.练习函数调用 35.设置文本颜色 36.求100之内的素数 37.对10个数进行排序 38.求3*3矩阵对角线元素之和 39.数字插入数组重新排序 40.将一个数组逆序输出 41.static定义静态变量用法 42.使用auto定义变量用法 43.使用static的另一用法 44.使用external的用法 45.使用register定义变量方法 46.宏#define命令练习(1) 47.宏#define命令练习(2) 48.宏#define命令练习(3) 49.#if #ifdef和#ifndef的综合应用 50.#include 的应用练习 51.学习使用按位与 & 52.学习使用按位或 | 53.学习使用按位异或 ^ 54.取一个整数从右端开始的4~7位。 55.学习使用按位取反~ 56.用circle画圆形 57.学用line画直线 58.用rectangle画方形 59.画图综合例子 60.画图综合例子2 61.打印杨辉三角形 62.学习putpixel画点 63.画椭圆ellipse 64.利用ellipse and rectangle画图 65.画个最优美的图案 66.输入3个数字按大小顺序输出 67.输入数组交换元素重新输出 68.多个整数后移位置问题 69.圆圈报数问题 70.计算一个字符串长度 71.编写输入/输出函数 72.创建链表 73.反向输出链表 74.连接两个链表 75.算一道简单题目 76.调用函数求1/2+1/4+...+1/n 77.填空练习(指向指针的指针) 78.找到年龄最大的人 79.字符串排序 80.海滩猴子分桃 81.已知公式条件求数字 82.八进制转换为十进制 83.求0-7所能组成的奇数个数 84.由两个素数之和表示的偶数 85.判断一个素数能被几个9整除 86.两个字符串连接程序 87.结构体变量传递 88.读取数字的整数值并打印出该值个数的* 89.数据加密 90.专升本一题 91.时间函数举例1 92.时间函数举例2 93.时间函数举例3 94.一个猜数游戏 95.家庭财务管理小程序 96.计算字符串中子串出现的次数 97.输入字符并保存到磁盘 98.字符串转换成大写字母并输出保存 99.文件操作应用1 100.文件操作应用2

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值