C语言典型例题二------杨辉三角
杨辉三角
1.杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。这就是我们用C语言写杨辉三角的关键之一。杨辉三角是一种数学工具,它是由一个数字三角形组成,其中第一行只有一个数字1,接下来的每一行都由前一行的相邻数字相加而来,最后一行为1 1,这种数字三角形以数学家杨辉的名字命名。杨辉三角具有很多有趣的数学特性,可以用于组合数学、概率论、数论等领域的计算和证明。
C语言中的位运算有哪些操作符
C语言中的位运算操作符包括:
- 按位与(&):两个位都是1,结果才为1,否则为0。
- 按位或(|):两个位中只要有一个为1,结果就为1,否则为0。
- 按位异或(^):两个位不相同,结果为1,否则为0。
- 按位取反(~):把操作数的每一位取反,即0变1,1变0。
- 左移(<<):将一个数的所有二进制位全部左移若干位,高位丢弃,低位补0。
- 右移(>>):将一个数的所有二进制位全部右移若干位,低位丢弃,高位补符号位或0。
在C语言中进行链表操作,需要先定义链表节点的结构体,即链表中每个节点的结构:
arduino
struct ListNode {
int val; // 节点存储的值
struct ListNode *next; // 指向下一个节点的指针
};
然后,我们可以定义一个指向链表头节点的指针:
ini
struct ListNode* head = NULL;
接下来,就可以进行链表的各种操作了,比如:
- 添加节点
ini
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = 1;
newNode->next = head;
head = newNode;
- 删除节点
ini
struct ListNode* cur = head;
struct ListNode* pre = NULL;
while (cur != NULL && cur->val != x) {
pre = cur;
cur = cur->next;
}
if (cur != NULL) {
if (pre == NULL) {
head = cur->next;
} else {
pre->next = cur->next;
}
free(cur);
}
- 遍历链表
ini
struct ListNode* cur = head;
while (cur != NULL) {
// 处理当前节点
cur = cur->next;
}
- 反转链表
ini
struct ListNode* pre = NULL;
struct ListNode* cur = head;
while (cur != NULL) {
struct ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head = pre;
这些操作只是链表操作的一部分,还有很多其他的操作,需要根据实际场景进行使用。在C语言中进行链表操作,需要先定义链表节点的结构体,即链表中每个节点的结构:
arduino
struct ListNode {
int val; // 节点存储的值
struct ListNode *next; // 指向下一个节点的指针
};
然后,我们可以定义一个指向链表头节点的指针:
ini
struct ListNode* head = NULL;
接下来,就可以进行链表的各种操作了,比如:
- 添加节点
ini
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = 1;
newNode->next = head;
head = newNode;
- 删除节点
ini
struct ListNode* cur = head;
struct ListNode* pre = NULL;
while (cur != NULL && cur->val != x) {
pre = cur;
cur = cur->next;
}
if (cur != NULL) {
if (pre == NULL) {
head = cur->next;
} else {
pre->next = cur->next;
}
free(cur);
}
- 遍历链表
ini
struct ListNode* cur = head;
while (cur != NULL) {
// 处理当前节点
cur = cur->next;
}
- 反转链表
ini
struct ListNode* pre = NULL;
struct ListNode* cur = head;
while (cur != NULL) {
struct ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head = pre;
这些操作只是链表操作的一部分,还有很多其他的操作,需要根据实际场景进行使用。在C语言中进行链表操作,需要先定义链表节点的结构体,即链表中每个节点的结构:
arduino
struct ListNode {
int val; // 节点存储的值
struct ListNode *next; // 指向下一个节点的指针
};
然后,我们可以定义一个指向链表头节点的指针:
ini
struct ListNode* head = NULL;
接下来,就可以进行链表的各种操作了,比如:
- 添加节点
ini
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = 1;
newNode->next = head;
head = newNode;
- 删除节点
ini
struct ListNode* cur = head;
struct ListNode* pre = NULL;
while (cur != NULL && cur->val != x) {
pre = cur;
cur = cur->next;
}
if (cur != NULL) {
if (pre == NULL) {
head = cur->next;
} else {
pre->next = cur->next;
}
free(cur);
}
- 遍历链表
ini
struct ListNode* cur = head;
while (cur != NULL) {
// 处理当前节点
cur = cur->next;
}
- 反转链表
ini
struct ListNode* pre = NULL;
struct ListNode* cur = head;
while (cur != NULL) {
struct ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head = pre;
这些操作只是链表操作的一部分,还有很多其他的操作,需要根据实际场景进行使用。
2.先定义一个二维数组:a[N][N],略大于要打印的行数。再令两边的数为 1,即当每行的第一个数和最后一个数为 1。a[i][0]=a[i][i-1]=1,n 为行数。除两边的数外,任何一个数为上两顶数之和,即 a[i][j] = a[i-1][j-1] + a[i-1][j]。最后输出杨辉三角。
3.代码如下:
4.运行结果