B2143 进制转换
题目描述
进制转换 - 洛谷
运行代码
#include<stdio.h>
int main(){
int a,b,i=0,j,num[20];
char k[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
scanf("%d",&a);
scanf("%d",&b);
do{
i++;
num[i]=a%b;
a=a/b;
}while(a!=0);
printf("");
for(j=i;j>=1;j--)
printf("%c",k[num[j]]);
}
简化后
#include <stdio.h>
int main() {
int a, b, i = 0;
char k[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
scanf("%d", &a);
scanf("%d", &b);
// 直接在循环条件中进行计算和判断,无需单独的自增操作和额外的变量来记录次数
int num[20];
while (a!= 0) {
num[i++] = a % b;
a /= b;
}
// 使用逆序遍历数组的方式输出结果
printf("");
for (int j = i - 1; j >= 0; j--) {
printf("%c", k[num[j]]);
}
return 0;
}
代码思路
通过不断地对输入的十进制数 a
进行除以目标进制数 b
的操作,获取每次除法运算的余数,将这些余数按照从低位到高位的顺序存储起来,最后再按照从高位到低位的顺序输出这些余数对应的字符表示,从而得到转换后的目标进制数。
- 对于将十进制数转换为其他进制数,其基本原理是基于数制转换的规则。例如,将十进制数转换为二进制数时,就是不断地用十进制数除以 2,记录每次的余数,直到商为 0。最后将余数逆序排列就是对应的二进制数。同样的道理适用于转换为其他进制,这里代码中的
b
就是目标进制数。 - 在代码中,通过
do-while
循环来不断进行除法运算并获取余数。每次循环中,先将当前的余数存储到数组num
中,然后更新被除数a
(即a = a / b
),直到被除数a
变为 0,此时表示转换过程完成。 - 最后,通过
for
循环从存储余数的数组num
的末尾(即高位)开始,依次输出每个余数对应的字符表示。这里通过字符数组k
来将数字形式的余数转换为对应的十六进制字符表示(因为十六进制数会用到0 - 9
以及A - F
这些字符),对于小于 10 的余数,直接对应k
数组中的0 - 9
字符,对于大于等于 10 的余数,对应k
数组中的A - F
字符。
P1003 [NOIP2011 提高组] 铺地毯
题目描述
[NOIP2011 提高组] 铺地毯 - 洛谷
运行代码
#include<stdio.h>
const int MAXN = 10000 + 5;
int a[MAXN], b[MAXN], g[MAXN], k[MAXN];
int main() {
int n, x, y;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d%d%d%d", &a[i], &b[i], &g[i], &k[i]);//输入
}
scanf("%d%d", &x, &y);
int ans = -1;
for(int i = 0; i < n; i++) {
if(x >= a[i] && y >= b[i] && x <= a[i] + g[i] && y <= b[i] + k[i]) {
ans = i + 1;//ans的最终值恰好是最上面的那张地毯编号
}
}
printf("%d\n", ans);//输出结果
return 0;
}
改进后
#include <stdio.h>
#define MAXN 10005
int main() {
int n, x, y;
int carpets[MAXN][4];
scanf("%d", &n);
// 读取每张地毯的信息
for (int i = 0; i < n; i++) {
scanf("%d %d %d %d", &carpets[i][0], &carpets[i][1], &carpets[i][2], &carpets[i][3]);
}
scanf("%d %d", &x, &y);
int ans = -1;
for (int i = 0; i < n; i++) {
if (x >= carpets[i][0] && y >= carpets[i][1] && x <= carpets[i][0] + carpets[i][2] && y <= carpets[i][1] + carpets[i][3]) {
ans = i + 1;
break; // 一旦找到符合条件的地毯,就可以直接退出循环,因为只需要找到最上面的那张地毯
}
}
printf("%d\n", ans);
return 0;
}
代码思路
这段代码的主要功能是接收一系列矩形区域(可看作是一张张 “地毯”)的坐标信息以及一个点的坐标,然后判断这个点位于哪一张 “地毯” 上(如果存在的话),最后输出该 “地毯” 的编号;若点不在任何 “地毯” 上,则输出 -1。
- 首先,定义了一些数组
a
、b
、g
、k
来分别存储每张 “地毯” 的起始横坐标、起始纵坐标、横向长度、纵向长度等信息。还定义了常量MAXN
用于限制数组的大小,以防止数组越界(这里表示最多能处理的 “地毯” 数量)。 - 在
main
函数中:- 先读取要处理的 “地毯” 数量
n
,然后通过循环依次读取每张 “地毯” 的坐标信息并存储到相应数组中。 - 接着读取一个点的坐标
x
和y
。 - 之后再通过一个循环遍历所有的 “地毯”,对于每张 “地毯”,判断给定的点
(x, y)
是否在该 “地毯” 所表示的矩形区域内。判断条件为:点的横坐标x
要大于等于该 “地毯” 的起始横坐标a[i]
,纵坐标y
要大于等于起始纵坐标b[i]
,同时横坐标x
要小于等于该 “地毯” 起始横坐标加上横向长度a[i] + g[i]
,纵坐标y
要小于等于起始纵坐标加上纵向长度b[i] + k[i]
。如果满足这些条件,就说明点在这张 “地毯” 上,将ans
赋值为该 “地毯” 的编号i + 1
(因为数组下标从 0 开始,所以编号要加 1)。 - 最后输出
ans
的值,这个值就是点所在 “地毯” 的编号,如果点不在任何 “地毯” 上,ans
的值就是 -1。
- 先读取要处理的 “地毯” 数量