目录
学习完了函数和数组,我们来进行简单的应用吧~
写两个函数,分别求两个数的最大公约数和最小公倍数
一般我们求最大公约数可以使用辗转相除法,求出最大公约数之后,我们可以用最大公约数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