首页 > 其他分享 >函数和数组的混合使用例子

函数和数组的混合使用例子

时间:2024-05-25 17:31:28浏览次数:10  
标签:arr 函数 int ++ 公倍数 最大公约数 例子 数组 printf

目录

写两个函数,分别求两个数的最大公约数和最小公倍数

写一个函数,使一个3x3的整形二维数组转置(行列转换)

写一个函数打印杨辉三角

扫雷游戏


学习完了函数和数组,我们来进行简单的应用吧~

写两个函数,分别求两个数的最大公约数和最小公倍数

    一般我们求最大公约数可以使用辗转相除法,求出最大公约数之后,我们可以用最大公约数x最小公倍数==两个数的乘积来计算最小公倍数。

原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

使用:在使用辗转相除法时,先用较大的数除以较小的数,算出余数。然后用除数继续除以余数,求出新的余数。接着再用这个除数除以新的余数,不停循环直到余数为零为止。此时的除数就是最大公因数。

代码如下:

//写两个函数,分别求两个数的最大公约数和最小公倍数
#include<stdio.h>
int greatest_common_divisor(int a, int b)
{
	while (a % b != 0)
	{
		int k = a % b;
		a = b;
		b = k;
		//错误写法
		//a=b;
		//b=a%b;
		//这个时候a的值已经发生改变
	}
	return b;
}
int least_common_multiple(int mul, int gcd)
{
	return mul / gcd;
}
int main()
{
	int m = 0;
	int n = 0;
	printf("请输入两个数:\n");
	scanf("%d %d", &m, &n);
	int mul = m * n;
	if (m < n)
	{
		int tmp = m;
		m = n;
		n = tmp;
	}//保证m为较大数
	int gcd = greatest_common_divisor(m, n);
	int lcm = least_common_multiple(mul,gcd);
	printf("最大公约数为%d\n最小公倍数为%d\n", gcd, lcm);
	return 0;
}

测试:

求最小公倍数的第二种方法:

    我们知道最小公倍数一定是两个数(a,b)任何一个数的倍数,我们可以把其中一个数a乘上i(2,3,4....)然后再与另外一个数b相除,如果余数为0,说明a*i就是最小公倍数。

局部代码如下:

int least_common_multiple(int a, int b)
{
	int i = 0;
	int mu = 0;
	for (i = 2; ; i++)
	{
		mu = i * a;
		if (mu % b == 0)
			break;
	}
	return mu;
}

全部代码:

#include<stdio.h>
int greatest_common_divisor(int a, int b)
{
	while (a % b != 0)
	{
		int k = a % b;
		a = b;
		b = k;
	}
	return b;
}
int least_common_multiple(int a, int b)
{
	int i = 0;
	int mu = 0;
	for (i = 2; ; i++)
	{
		mu = i * a;
		if (mu % b == 0)
			break;
	}
	return mu;
}
int main()
{
	int m = 0;
	int n = 0;
	printf("请输入两个数:\n");
	scanf("%d %d", &m, &n);
	int mul = m * n;
	if (m < n)
	{
		int tmp = m;
		m = n;
		n = tmp;
	}//保证m为较大数
	int gcd = greatest_common_divisor(m, n);
	int lcm = least_common_multiple(m, n);
	printf("最大公约数为%d\n最小公倍数为%d\n", gcd, lcm);
	return 0;
}

我们可以看到运行结果是正确的。

写一个函数,使一个3x3的整形二维数组转置(行列转换)

方法一:

使用一个二维数组进行接收

//写一个函数,使一个3x3的整形二维数组转置(行列转换)
#include<stdio.h>
void print_arr(int arr[][3])
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
void swap_arr(int arr[][3])
{
	int brr[3][3] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			brr[j][i] = arr[i][j];
		}
	}
	printf("后\n");
	print_arr(brr);
}
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	printf("前\n");
	print_arr(arr);
	swap_arr(arr);
	return 0;
}

当我们仔细观察这个结果,我们可以发现当i==j时,arr[i][j]的值没有发生改变,我们只需要把副对角线两端的值进行交换,也就是右下角和左上角的数进行交换就可以了。这个时候需要特别注意i和j的取值,取右下角或者左上角,如果依然是原来的取值的话,右下角和左上角的数交换了两次,就没有意义了。


#include<stdio.h>
void print_arr(int arr[][3])
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
void swap_arr(int arr[][3])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 2; i++)
	{
		for (j = 1; j < 3; j++)
		{
			if (i != j)
			{
				int tmp = arr[i][j];
				arr[i][j] = arr[j][i];
				arr[j][i] = tmp;
			}
		}
	}
	printf("后\n");
	print_arr(arr);
}
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	printf("前\n");
	print_arr(arr);
	swap_arr(arr);
	return 0;

写一个函数打印杨辉三角

通过观察我们发现:

第一行和第二行以及三角形两边都是1,从第三行开始,下面除了两边的数是上一行两个相对的数和,这里我们可以想到使用一个二维数组arr[i][j]

当i==1或者i==0或者i==j或者j==0时,arr[i][j]==1.

其他的时候arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]

我们以一个10行为例,代码如下:

//函数打印杨辉三角
#include<stdio.h>
void YH(int arr[][20], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			if (i == 0 || i == 1 || j == 0 || j == i)
				arr[i][j] = 1;
			else
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
		}
	}
	for (i = 0; i < n; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[20][20] = { 0 };
	int n = 0;
	printf("请输入行数:\n");
	scanf("%d", &n);
	YH(arr, n);
	return 0;
}

扫雷游戏

这是一个比较复杂的应用,前面有一篇博客有详细的讲解,感兴趣的可以看看。

标签:arr,函数,int,++,公倍数,最大公约数,例子,数组,printf
From: https://blog.csdn.net/2401_82924480/article/details/139198313

相关文章

  • C语言中的函数(2)
    目录前言函数的调用和声明函数的嵌套调用 函数的链式访问函数的递归调用递归求n的阶乘递归计算斐波那契数static和extern作用域和生命周期变量存储方式作用static修饰局部变量extern的使用static修饰全局变量static修饰函数函数的要求      内聚性强......
  • 学习javascript的数组
    1.什么是数组?数组:(Array)是一种数据类型,属于引用数据类型。作用:在单个变量名下存储多个数据2.声明语法let数组名=[数据1,数据2......];注意事项:数组是按照顺序保存(是有序的),所以,每一个数据都有自己的编号。编号从0开始,数据的编号经常称为索引或下标。数组可以存储任意......
  • 数据库函数下拉式求和
    问题:如何用Dsum实现单条件求和的下拉函数解决:=DSUM($C$1:$E$9,D$1,$K$1:$K2)-SUM(L$1:L1)Dsum公式在第2行实现的是股票名称为A的求和结果;到第3行时变成股票名称为A和B的求和结果,这时需要减掉上一个单元格的数据;到第4行则需要减掉上两个单元格求和的数据。使用Sum(L$1:L1)......
  • 【刷题笔记Day2】数组|977.有序数组的平方、209. 长度最小的子数组、59.螺旋矩阵II
    文章目录977.有序数组的平方解题思路遇到的问题及解决方案209.长度最小的子数组解题思路遇到的问题及解决方案59.螺旋矩阵II解题思路遇到的问题及解决方案总结977.有序数组的平方题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新......
  • 构造函数
    类成员初始化方式:1、通过构造函数的参数列表初始化。2、在构造函数中赋值完成初始化。//1、通过构造和函数的参数列表初始化Seles_data::Sales_data(constSales_data&sa){ this->bookNo=sa.bookNo; this->revenue=sa.revenue; this->units_sold=sa.units_sold;}......
  • 关于字符串的功能函数小结
    笔者做项目过程中,使用了很多关于字符串的C库中自带功能函数,极大便利了项目流程。再次做一个小结,之后若有增加会继续补充。所需采用函数序号函数/描述1char*strcat(char*dest,constchar*src)【char*strncat(char*dest,constchar*src,size_tn)】功能:连接......
  • C语言---数组中逆序输出--新
    #include<stdio.h>intmain(){//下面的是输入intarr[10]={0};//创建一个大小为10的数组for(inti=0;i<10;i++){scanf("%d",&arr[i]);//循环输入i的值}//为什么是i从9开始,不是从0开始//因为总共10个数,所以最大数......
  • 第17章 STL动态数组类
    1std::vector的特点vector是一个模板类,提供了动态数组的通用功能:在数组尾部插入元素时间是固定的在数组中间添加或删除元素所需时间与改元素后面的元素个数成正比存储的元素数是动态的,vector类负责管理内存vector是一种动态数组,结构体如下:2vector操作2.1实例化vector......
  • 数组类型的有界阻塞队列-ArrayBlockingQueue
    一:ArrayBlockingQueue简介  一个由循环数组支持的有界阻塞队列。它的本质是一个基于数组的BlockingQueue的实现。它的容纳大小是固定的。此队列按FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中存在时间最长的元素。队列的尾部是在队列中存在时间最短的元素。......
  • 吴恩达机器学习 week1 一元回归模型的成本函数
    01学习目标    学习建立一元线性回归模型的成本函数02实现工具  (1)代码运行环境       Python语言,Jupyternotebook平台  (2)所需模块       NumPy,Matplotlib,lab_utils_uni      (lab_utils_uni是课程中用于绘制复......