一、终端输入行数,打印倒金字塔
#include <stdio.h>
int main()
{
int rows;
printf("请输入倒金字塔的行数: ");
scanf("%d", &rows);
for (int i = rows; i > 0; i--)
{
// 打印空格
for (int j = 0; j < rows - i; j++)
{
printf(" ");
}
// 打印星号
for (int k = 0; k < (2 * i - 1); k++)
{
printf("*");
}
// 换行
printf("\n");
}
return 0;
}
代码解析
-
包含头文件
#include <stdio.h>
这行代码包含了标准输入输出库
stdio.h
,它提供了输入输出函数如printf
和scanf
。 -
主函数
int main() {
这是程序的入口点,从这里开始执行。
-
变量声明
int rows;
声明一个整型变量
rows
,用于存储用户输入的倒金字塔的行数。 -
提示用户输入
printf("请输入倒金字塔的行数: ");
使用
printf
函数在控制台输出提示信息,要求用户输入倒金字塔的行数。 -
读取用户输入
scanf("%d", &rows);
使用
scanf
函数从控制台读取用户输入的整数,并将其存储到变量rows
中。 -
外层循环
for (int i = rows; i > 0; i--) {
这是一个递减的
for
循环,从rows
开始,每次循环减一,直到i
大于零为止。这个循环控制倒金字塔的行数。 -
打印空格
for (int j = 0; j < rows - i; j++) { printf(" "); }
内层循环用于打印每行前面的空格。空格的数量是
rows - i
,随着i
的减小而增加。 -
打印星号
for (int k = 0; k < (2 * i - 1); k++) { printf("*"); }
另一个内层循环用于打印星号。星号的数量是
2 * i - 1
,随着i
的减小而减少。 -
换行
printf("\n");
每行结束后,使用
printf
函数输出一个换行符,使光标移动到下一行。 -
返回值
return 0;
main
函数返回0
,表示程序正常结束。
二、使用异或和算术求和交换两个数
#include <stdio.h>
int main()
{
int x = 10;
int y = 20;
printf("Before swap: x = %d, y = %d\n", x, y);
// 使用异或运算交换值
x = x ^ y;
y = x ^ y;
x = x ^ y;
printf("After swap: x = %d, y = %d\n", x, y);
return 0;
}
步骤解释
-
Step 1:
x = x ^ y;
- 初始值:
x = 10
(二进制表示为1010
),y = 20
(二进制表示为10100
) - 计算
x ^ y
:1010 ^ 10100 = 11110
(二进制) - 结果:
x = 30
(十进制表示为11110
)
- 初始值:
-
Step 2:
y = x ^ y;
- 当前值:
x = 30
(二进制表示为11110
),y = 20
(二进制表示为10100
) - 计算
x ^ y
:11110 ^ 10100 = 1010
(二进制) - 结果:
y = 10
(十进制表示为1010
)
- 当前值:
-
Step 3:
x = x ^ y;
- 当前值:
x = 30
(二进制表示为11110
),y = 10
(二进制表示为1010
) - 计算
x ^ y
:11110 ^ 1010 = 10100
(二进制) - 结果:
x = 20
(十进制表示为10100
)
- 当前值:
最终结果
在执行完这三个步骤之后,x
和 y
的值被成功交换。因此,输出将会是:
Before swap: x = 10, y = 20 After swap: x = 20, y = 10
总结
通过使用异或运算符,我们可以在不引入第三个临时变量的情况下交换两个整数的值。这种方法利用了异或运算的性质:一个数与另一个数异或两次会还原原来的数。