一、进制转换
题目:输入一个十进制数,将其化成N进制数输出(2≤N≤16)。 输出结果时,大于等于10的数字用字母代替,A代表10,B代表11以此类推。
输入说明:你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,每行有2个数,分别代表十进制数m(0≤ m < 2^31)和进制N(2≤N≤16),它们以空格分隔,在行首和行尾没有多余的空格。
输出说明:对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案:输出10进制数转换后的N进制数。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。
个人总结:
这道题是一道非常典型的进制转换问题,核心使用的是整数除基取余算法,同时结合了字符映射与结果逆序输出,是数据表示与基础算法结合的经典例题。
从算法思想上看,十进制整数转换为 N 进制的通用方法就是"不断除以 N,记录余数"。对一个十进制数 m,每一次用 m 除以 N,得到的余数就是当前 N 进制表示的最低位,然后再用商继续重复这一过程,直到商变为 0 为止。这个过程在数学上是严格成立的,因此可以适用于任意进制(只要 N ≥ 2)。代码中通过 while (num > 0) 循环完整实现了这一算法。
在实现细节上,由于余数是从最低位到最高位产生的,直接输出会得到反序结果,因此程序先将每一位存入字符数组 result,再通过倒序遍历数组进行输出。这一步体现了一个非常重要的思想:算法生成顺序和最终表示顺序不一致时,需要借助中间存储或栈结构进行反转。在这里,字符数组实际上起到了"栈"的作用。
代码:
#include <stdio.h>
int main() {
int num, N;
while (scanf_s("%d %d", &num, &N) == 2)
{
char result[100];
int index = 0;
// 特殊情况:0
if (num == 0) {
printf("0");
//return 0;
}
while (num > 0) {
int rem = num % N;
if (rem < 10)
result[index++] = rem + '0';
else
result[index++] = rem - 10 + 'A';
num /= N;
}
// 逆序输出
for (int i = index - 1; i >= 0; i--) {
printf("%c", result[i]);
}
printf("\n");
}
return 0;
}
二、表达式求值
题目:以字符串形式输入仅有整数和加减(正负)号构成的表达式,输出该表达式的值。
输入说明:标准输入设备中有多组测试数据,每组输入数据由一行组成,输入仅有整数和加减(正负)号构成的表达式(但是表达式可以插入空格)。
输出说明:依次输出从标准输入设备中读入的每一组测试数据对应的结果,输出一行,输出该表达式的值。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。
个人总结:
这道题本质上是一个字符串解析 + 顺序扫描求值(线性表达式求值)问题。由于表达式中只包含整数和加减号,不涉及括号和乘除法,因此不需要构建复杂的语法树或使用栈结构,只需要按照从左到右的顺序扫描并累加即可。
从算法思想上看,本题采用的是单遍扫描算法(One-pass Parsing)。程序通过 fgets 读入整行字符串,然后用一个下标 i 从左到右遍历字符数组,对每个字符进行分类处理。这种做法属于典型的"状态驱动解析"方式。
核心变量有三个:result 用来保存当前累计结果,num 用来保存正在读取的整数,sign 用来表示当前数字前面的符号(+1 或 -1)。算法逻辑可以理解为:当遇到数字时,就不断构造当前整数;当遇到加号或减号时,说明前一个整数已经结束,就把 sign * num 累加到 result 中,然后更新符号并开始读取下一个整数;循环结束后,再把最后一个整数加入结果。这种模式本质上是一种"延迟结算"的思想------只有当遇到下一个运算符时,才对前一个数字进行计算。
代码:
#include <stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char str[1000];
while (fgets(str, sizeof(str), stdin) != NULL)
{
int i = 0;
long long result = 0;
long long num = 0;
int sign = 1;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
i++;
}
else if (str[i] == '+')
{
result += sign*num;
num = 0;
sign = 1;
i++;
}
else if (str[i] == '-')
{
result += sign*num;
num = 0;
sign = -1;
i++;
}
else if (isdigit(str[i]))
{
num = num * 10 + (str[i] - '0');
i++;
}
else{
i++;
}
}
result += sign*num;
printf("%lld\n", result);
}
return 0;
}
三、删除字符
题目:从键盘输入一个字符串和一个字符,将输入字符从字符串中删除,输出新的字符串。如果字符串中没有此字符,则原样输出字符串。
输入说明:输入两行,第一行输入一个字符串,第二行输入一个字符。字符串最多允许输入20个任意字符。
输出说明:输出删除字符后的字符串。
个人总结:这道题本质上是一个字符串遍历与字符过滤问题,属于最基础的字符串处理算法。核心思想非常简单:逐个遍历字符串中的每个字符,如果该字符不等于待删除字符,就输出;如果相等,则跳过。整个过程不涉及复杂数据结构,是典型的线性扫描算法。
从算法角度看,本题采用的是顺序扫描 + 条件筛选(过滤)算法。程序先用 fgets 读入整行字符串,然后读取要删除的字符。之后通过 for 循环从头到尾遍历字符串,当 str[i] != ch 时就输出该字符,否则直接跳过。这种方法时间复杂度为 O(n),其中 n 是字符串长度(最多20),效率非常高。
代码:
#include <stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char str[25];
char ch;
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
scanf_s("%c", &ch);
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] != ch)
{
printf("%c", str[i]);
}
}
printf("\n");
return 0;
}
四、英语翻译
4.A digital computer is not a single machine: rather, it is a systemcomposed of five distinct elements: (1) a central processingunit; (2) input devices; (3) memory storage devices; (4) outputdevices; and (5) a communications network, called a bus, whichlinks all the elements of the system and connects the system tothe external world.
数字计算机并不是一台单一的机器,而是一个由五个不同部分组成的系统:(1) 中央处理单元;(2) 输入设备;(3) 存储设备;(4) 输出设备;以及 (5) 通信网络,称为总线,它连接系统中的所有组成部分,并将系统与外部世界连接起来。
5.A program is a sequence of instructions that tells the hardwareof a computer what operations to perform on data. Programscan be built into the hardware itself, or they may existindependently in a form known as software. In some specialized,or "dedicated", computers the operating instructions areembedded in their circuitry; common examples are themicrocomputers found in calculators, wristwatches, car engines,and microwave ovens. A general-purpose computer, on theother hand, although it contains some built-in programs (inROMor instructions(in the processor chip), depends onexternal programs to perform useful tasks. Once a computer hasbeen programmed, it can do only as much or as little as thesoftware controlling it at any given moment enables it to do.Software in widespread use includes a wide range of application sprograms-instructions to the computer on how to performvarious tasks.
程序是一系列指令,用来告诉计算机的硬件应对数据执行哪些操作。程序可以被嵌入到硬件本身,也可以以一种称为软件的形式独立存在。在某些专用(或"专门用途")计算机中,操作指令被嵌入在电路中;常见的例子包括计算器、手表、汽车发动机和微波炉中的微型计算机。另一方面,通用计算机虽然包含一些内置程序(存储在只读存储器ROM中或处理器芯片中的指令),但它主要依赖外部程序来执行有用的任务。一旦计算机被编程,在任何特定时刻,它所能完成的工作多少完全取决于控制它的软件。广泛使用的软件包括各种应用程序------即指导计算机执行各种任务的指令。
6.There is active research to make computers out of manypromising new types of technology, such as optical computers,DNAcomputers, neural computers, and quantum computers.Most computers are universal, and are able to calculate anycomputable function, and are limited only by their memorycapacity and operating speed. However, different designs ofcomputers can give very different performance for particularproblems; for example, quantum computers can potentiallybreak some modern encryption algorithms (by quantumfactoring) very quickly.
目前正在积极研究利用多种有前景的新技术来制造计算机,例如光学计算机、DNA计算机、神经计算机和量子计算机。大多数计算机都是通用的,能够计算任何可计算的函数,其限制仅在于存储容量和运行速度。然而,不同的计算机设计在解决特定问题时可能表现出非常不同的性能;例如,量子计算机有可能通过量子分解技术非常快速地破解某些现代加密算法。
