c刷题(一)

目录

1.输出100以内3的倍数

2.将3个数从大到小输出

3.打印100~200素数

方法一

方法二

4.显示printf的返回值

最大公约数

试除法

辗转相除法

九九乘法表

求十个数的最大值


1.输出100以内3的倍数

法一:

cpp 复制代码
int n = 0;
while (n*3 < 100)
	{
		printf("%d ", n*3);
		n++;
	}

法二:

cpp 复制代码
	int i = 0;
	for (i = 1; i <= 100; i++) 
	{
		if (i % 3 == 0)
		{
			printf("%d ", i);
		}
	}

2.将3个数从大到小输出

由于只有3个数,我们可以采用中间变量换值的方法,相比于依次判断就显得很简单了。

cpp 复制代码
	int a = 0;
	int b = 0;
	int c = 0;
	int tmp = 0;
	scanf("%d %d %d", &a, &b, &c);
	if (a < c)
	{
		tmp = c;
		c = a;
		a = tmp;
	}
	if (a < b)
	{
		tmp = b;
		b = a;
		a = tmp;
	}
	if (b < c)
	{
		tmp = b;
		b = c;
		c = tmp;
	}

	printf("%d %d %d\n", a, b, c);
	return 0; 
}

需要注意的是,这种办法改变了原变量的值。

3.打印100~200素数

方法一

素数,也称质数,特点是只能被1和自身整除 ,那我们是不是可以用2~n-1之间的数依次来取模进行判断呢?如果有一个数能被整除,那它就不是质数,反之是质数。

cpp 复制代码
	int i = 101;
	int n;
	for (i = 101; i < 200; i++)
	{
		int flag = 0;//开关
		for (n = 2; n < i; n++)
		{
			if (i % n == 0)
			{
				flag = 0;
				break;
			}
			else flag = 1;
		}
		if(flag == 1)
			printf("%d ", i);	
	 }

因为其中一个数不能整除并不代表它不是素数,所以我们设置一个开关 ,依次在真和假中切换,能整除为假,不能整除为真,遍历一遍后根据flag的值判断它是否为素数。

方法二

任意不是素数的数都可以分为m*n的形式。

16 = 4*4

16 = 2*8

如果将这个数开平方,如果它不是素数,则在2~√n之间必定有个数使它的因子。

(例:√18 = 3(整形省略分数)

18 = 2*9 18 = 3*6

大家想想是不是这样的道理,这样做可以减少遍历的次数。

cpp 复制代码
#include <stdio.h>
#include<math.h>
int main(){
    int i = 101;
	int n;
	for (i = 101; i < 200; i+2)
	{
		int flag = 0;
		for (n = 2; n <= sqrt(i); n++)
		{
			if (i % n == 0)
			{
				flag = 0;
				break;
			}
			else flag = 1;
		}
		if(flag == 1)
			printf("%d ", i);	
	 }
return 0;
}

注意因子可以等于**√n,s** qrt是用来求根号的函数,需要包含头文件math.h

因为偶数不可能是素数,我们可以跳过偶数部分只进行奇数的循环。

4.显示printf的返回值

要求:第一行输入printf的输出值,第二行输出printf的返回值。

cpp 复制代码
	int ret = printf("hello world!");
	printf("\n%d", ret);
//等价于
	int ret = printf("\n%d", printf("hello world!"));

由此我们可以得出结论:printf返回值是字符的个数

最大公约数

试除法

我们找到两个数中较小的那个,用它依次递减,如果能被这两个数整除,那它就是最大公约数。

cpp 复制代码
    int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	int ret = a > b ? b : a;

	while (a % ret || b % ret)
	{
		ret--;
	}
	printf("%d\n", ret);

辗转相除法

具体来说就是两个数先求模,如果不等于0,被除数作为下一个除数,它们的模为新的被除数继续直到没有余数为止

例如:24%12 = 0,则12就是最大公约数。25%12 = 1,12%1 = 0,1就是最大公约数。

反过来12%24 = 12,24%12 = 0,方法仍成立。

cpp 复制代码
	int a = 0, b = 0;
	int r = 0;
	scanf("%d %d", &a, &b);
	while (r = a % b)
	{
		a = b;
		b = r;
	}
	printf("%d\n", b); 

附加题:如果要求最小公倍数该怎么做呢?

这里有个公式:最小公倍数 = 两数之积除以最大公约数(a*b/r)

九九乘法表

cpp 复制代码
    int i = 0;
	for (i = 1; i <= 9; i++)
	{
		//打印一行
		int j = 0;
		for (j=1; j<=i; j++)//列数不超过行数
		{
			printf("%d*%d=%-2d ", i, j, i * j);
		}
		printf("\n");
	}

不多赘述,注意我们这里采用左对齐**%-2d** 的方式**,**使得代码整齐,希望大家写代码的时候也能用到这样的技巧。

求十个数的最大值

这个没什么好说的,假定一个变量max遍历数组,选出最大值即可。需要注意的是,max只能是数组内的一个值,如果给它初始值为0,遇到负数可能会出现错误。

cpp 复制代码
int arr[] = { -1,-2,-3,-4,-5,-6,-7,-8,-9,-10 };
	int max = arr[0];
	int i = 0;
	for (i = 1; i < 10; i++)//从第二个数开始
	{
		if (arr[i] > max)
			max = arr[i];
	}
	
	printf("%d\n", max);
相关推荐
和光同尘@17 分钟前
74. 搜索二维矩阵(LeetCode 热题 100)
数据结构·c++·线性代数·算法·leetcode·职场和发展·矩阵
一去不复返的通信er18 分钟前
SVD预编码
算法·信息与通信·预编码算法·通信原理
zl_dfq33 分钟前
数据结构之【顺序表简介】
数据结构·顺序表
code bean41 分钟前
【C# 数据结构】队列 FIFO
开发语言·数据结构·c#
柠石榴1 小时前
【练习】【二分】力扣热题100 34. 在排序数组中查找元素的第一个和最后一个位置
c++·算法·leetcode·二分
梅茜Mercy1 小时前
数据结构:栈和队列详解(下)
数据结构
Tisfy1 小时前
LeetCode 2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)
算法·leetcode·深度优先·dfs·题解·记忆化搜索·深度优先搜索
Trouvaille ~1 小时前
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
数据结构·c++·算法·蓝桥杯·计算机科学·平衡二叉树·avl
我爱蛋蛋后1 小时前
Linux驱动开发之音频驱动与基础应用编程
linux·c语言·驱动开发·音视频
陈浩源同学2 小时前
学习 TypeScript 栈和队列数据结构
前端·算法