首先本周学习的内容可能比较少,在这里先学姐说一声抱歉了。
拿第一题来说,对于杨辉三角,首先要注意的是
1.数组大小
2.数组的初始化
3.边界条件
4.考虑敲代码的过程中,运算的时间
然后在这里我就不强调那些基础的知识了,只是强调一下我如何优化一下我的代码吧
首先要使用数学公式∶许多题目以杨辉三角为例吧,就是每他们都有许多的规律和性质,例如每一行的首字母元素都是一当前的第二个元素,等于上一行的第i- 1个元素和第I个元素之和,因此可以利用这个规律和性质使用计算公式来计算。
然后还有一个去使用位运算,但是位运算的话,本人正在学习,可能不是很懂,所以不过多的赘述了
#include <stdio.h>
void generate_pascal_triangle(int n)
{
int triangle[n][n];
for (int i = 0; i < n; i++)
{
triangle[i][0] = 1;
triangle[i][i] = 1;
}
for (int i = 2; i < n; i++) {
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", triangle[i][j]);
}
printf("\n");
}
}
int main()
{
int n;
printf("请输入要生成的杨辉三角形的行数n(1<=n<=34): ");
scanf("%d", &n);
generate_pascal_triangle(n);
return 0;
}
本人在这星期学习如何将各种语句正确的使用,比如说条件语句中你可以用多分支语句,嵌套语句或,不嵌套这三种情况,同时也可以利用三元运算符把他们都代替,但是需要一个逻辑上的清晰也是后面需要加强。就比如说契波道题,这道题可能比较简单,可以利用三元运算符,将条件语句换掉但是本人在这里没用三元运算符。所以下一步本人还需要加强一下逻辑上的能力。
#include <stdio.h>
int f(int n)
{
if (n <= 0)
{
return 0;
}
else if (n == 1)
{
return 1;
} else
{
return f(n - 1) + f(n - 2);
}
}
void F(int n)
{
if (n <= 0)
{
printf("请输入大于0的整数!");
return;
}
for (int i = 0; i < n; i++) {
printf("%d ", f(i));
}
printf("\n");
}
int main()
{
int n = 10;
F(n);
return 0;
}
本人也学习了一些关于冒泡顺序的知识点,说一句题外话,一开始用的是没有,直接看什么语言就直接学了关于冒泡顺序的JAVA语句,但本人一直用C语言去编译,去去敲,搞了两三天也没有搞出来,最后发现离了个大谱。同时,冒泡程序的底层逻辑还是比较简单的
一个是循环的次数
二个是循环次数中比较的次数
因为冒号顺序给我的感觉是简单但效率比较低的一个排序算法
再接下来我要去学习,怎么去优化一下冒泡顺序的一些算法。我插入我敲的冒泡顺序。
#include <stdio.h>
void b(int arr[], int n)
{
int i, j, tmp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = {5, 2, 8, 6, 1, 9, 3, 7};
int n = sizeof(arr) / sizeof(int);
b(arr, n);
printf("排序后的数组:\n");
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}