82进制转换
#include <stdio.h>
int main() {
// 用于存储数字到字符的映射
// 0-9 对应 '0'-'9',10-15 对应 'A'-'F'
const char map[] = "0123456789ABCDEF";
long long m; // 存储输入的十进制数,使用 long long 以兼容 2^31 范围
int N; // 存储目标进制
// 循环读取多组输入,直到文件结束
while (scanf("%lld %d", &m, &N) != EOF) {
// 特殊情况:输入为 0 时,直接输出 0
if (m == 0) {
printf("0\n");
continue;
}
char res[32] = {0}; // 存储转换后的结果,最多 32 位足够
int idx = 0; // 结果数组的索引
// 核心转换逻辑:除 N 取余法
while (m > 0) {
int remainder = m % N; // 取余数
res[idx++] = map[remainder]; // 将余数映射为对应字符
m = m / N; // 更新商
}
// 逆序输出结果,因为除 N 取余得到的是低位到高位
for (int i = idx - 1; i >= 0; i--) {
printf("%c", res[i]);
}
printf("\n");
}
return 0;
}
83表达式求值
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 用于判断空白字符,增强兼容性
int main() {
// 定义变量
long long ans; // 最终计算结果(用long long避免大数溢出,如1000000)
char exp[100]; // 存储输入的表达式字符串(最多99个有效字符+'\0')
char op; // 存储当前运算符(+/-)
int i, count; // i:遍历字符串的索引;count:标记是否是第一个数字
long long num; // 临时解析的数字(同步用long long)
// 核心:用fgets循环读取每行输入,替代不安全的gets
// fgets参数说明:
// exp:存储字符串的数组;sizeof(exp):最多读取99个字符(防溢出);stdin:从键盘输入
// 返回值:成功返回exp指针,EOF/出错返回NULL,循环终止
while (fgets(exp, sizeof(exp), stdin) != NULL) {
// 第一步:处理fgets读取到的换行符(关键!)
// fgets会把回车(\n)也读入字符串,需删除,否则影响strlen和解析逻辑
int len = strlen(exp);
if (len > 0 && exp[len - 1] == '\n') {
exp[len - 1] = '\0'; // 将换行符替换为字符串结束符
}
// 初始化变量:结果置0、索引置0、计数置0
ans = 0;
i = 0;
count = 0;
// 第二步:逐字符解析表达式字符串
while (i < strlen(exp)) {
// 跳过所有空白字符(空格、制表符等,增强兼容性)
while (isspace((unsigned char)exp[i])) {
i++;
// 防止索引越界(比如字符串末尾全是空格)
if (i >= strlen(exp)) {
break;
}
}
// 若已遍历完所有字符,退出内层循环
if (i >= strlen(exp)) {
break;
}
// count计数:标记是否是第一个数字(第一次进入时count=0,执行后count=1)
count++;
// 第三步:处理第一个数字(特殊逻辑:无前置运算符,直接赋值给ans)
if (count == 1 && isdigit((unsigned char)exp[i])) {
op = '+'; // 第一个数字默认符号为正
num = 0; // 临时数字置0
// 解析多位数:逐字符转换为数字(如 '123' → 1*100 + 2*10 + 3)
while (isdigit((unsigned char)exp[i])) {
num = num * 10 + (exp[i] - '0'); // 字符转数字核心:'0'的ASCII码是48,差值即数字值
i++;
if (i >= strlen(exp)) {
break;
}
}
ans = num; // 第一个数字直接作为初始结果
continue; // 跳过后续逻辑,继续遍历字符串
}
// 第四步:解析运算符(+/-)
op = exp[i++]; // 读取运算符并将索引后移
// 跳过运算符后的所有空白字符
while (isspace((unsigned char)exp[i])) {
i++;
if (i >= strlen(exp)) {
break;
}
}
if (i >= strlen(exp)) {
break;
}
// 第五步:解析运算符后的数字
num = 0; // 临时数字置0
while (isdigit((unsigned char)exp[i])) {
num = num * 10 + (exp[i] - '0');
i++;
if (i >= strlen(exp)) {
break;
}
}
// 第六步:根据运算符更新最终结果
if (op == '+') {
ans += num;
} else if (op == '-') { // 显式判断减号,避免非法运算符干扰
ans -= num;
}
}
// 输出当前行表达式的计算结果
printf("%lld\n", ans); // 注意:long long类型用%lld输出
}
// 程序正常结束
return 0;
}
84删除字符
#include <stdio.h>
#include <string.h>
int main() {
// 定义字符数组存储输入字符串,长度为21以容纳20个字符和结束符'\0'
char str[21];
char del_char;
char result[21]; // 存储删除后的新字符串
int idx = 0; // 新字符串的索引
// 读取第一行输入字符串
// 使用fgets读取整行,避免scanf跳过空格的问题
if (gets(str) != NULL) {
// 去除fgets读取到的换行符
size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
}
// 读取第二行输入的待删除字符
scanf("%c", &del_char);
// 遍历原字符串,构建新字符串
for (int i = 0; str[i] != '\0'; i++) {
// 如果当前字符不等于要删除的字符,则保留到新字符串
if (str[i] != del_char) {
result[idx++] = str[i];
}
}
// 在新字符串末尾添加字符串结束符
result[idx] = '\0';
// 输出结果
printf("%s\n", result);
return 0;
}
数字计算机不是一台机器:相反,它是一个由五个不同元素组成的系统:(1)中央处理单元;(2)输入设备;(3)存储器存储设备;(4)输出设备;以及(5)一个称为总线的通信网络,它连接系统的所有元素,并将系统与外部世界连接起来。
程序是一系列指令,告诉计算机的硬件对数据执行什么操作。程序可以内置于硬件本身,也可以以称为软件的形式独立存在。在一些专业或"专用"计算机中,操作指令嵌入在其电路中;常见的例子是计算器、手表、汽车发动机和微波炉中的微型计算机。另一方面,通用计算机虽然包含一些内置程序(在ROM中)或指令(在处理器芯片中),但依赖于外部程序来执行有用的任务。一旦计算机被编程,它在任何给定时刻只能做与控制它的软件所能做的一样多或一样少的事情。广泛使用的软件包括广泛的应用程序程序指令,指导计算机如何执行各种任务。
人们正在积极研究利用许多有前景的新型技术制造计算机,如光学计算机、DNA2计算机、神经计算机和量子计算机。大多数计算机是通用的,能够计算任何可计算函数,并且仅受其存储容量和运行速度的限制。然而,不同的计算机设计对于特定的问题可能会产生非常不同的性能;例如,量子计算机可能会很快破解一些现代加密算法(通过量子因子分解)。
