进制转换
属于字符串的内容
题目
-
问题描述
输入一个十进制数,将其化成N进制数输出(2≤N≤16)。 输出结果时,大于等于10的数字用字母代替,A代表10,B代表11以此类推。 -
输入说明
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,每行有2个数,分别代表十进制数m(0≤ m < 2^31)和进制N(2≤N≤16),它们以空格分隔,在行首和行尾没有多余的空格。 -
输出说明
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案:输出10进制数转换后的N进制数。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。 -
输入范例
100 10
100 15 -
输出范例
100
6A
解题思路
- 本题思路是利用"除基取余法"进行进制转换。对于每一组输入的十进制数 m 和进制 N,如果 m 为 0 直接输出 0;否则不断用 m 除以 N,记录每次的余数 r=m%N,然后令 m=m/N 继续循环,直到 m 变为 0 为止。由于得到的余数是从低位到高位的顺序,因此需要把每次得到的数字保存起来,最后逆序输出。如果余数小于 10,直接转换成字符 '0'+r;如果余数大于等于 10,则用 'A'+(r-10) 转换成对应的大写字母。
整体代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
long long m;
int N;
while(cin>>m>>N){
if(m==0){
cout<<0<<endl;
continue;
}
string result="";
while(m>0){
int r=m%N;
if(r<10){
result+=char('0'+r);
}else{
result+=char('A'+(r-10));
}
m/=N;
}
reverse(result.begin(),result.end());
cout<<result<<endl;
}
return 0;
}
注意事项
- 注意数字和char的转化。
表达式求值
属于字符串的内容
题目
-
问题描述
以字符串形式输入仅有整数和加减(正负)号构成的表达式,输出该表达式的值。 -
输入说明
标准输入设备中有多组测试数据,每组输入数据由一行组成,输入仅有整数和加减(正负)号构成的表达式(但是表达式可以插入空格)。 -
输出说明
依次输出从标准输入设备中读入的每一组测试数据对应的结果,输出一行,输出该表达式的值。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。 -
输入范例
3+ 4+ 5+6
0+1 -
输出范例
18
1
解题思路
- 本题思路是把整行表达式当作字符串读入,然后用顺序扫描的方法模拟计算过程。由于表达式中只包含整数和加减号(可能夹杂空格),可以定义一个变量 result 保存当前计算结果,一个变量 num 用来构造当前读取的整数,一个变量 op 记录当前运算符(初始设为 '+')。从左到右遍历字符串,如果遇到数字,就用 num = num*10 + (当前字符-'0') 逐位累加构造整数;如果遇到 '+' 或 '-',说明前一个整数已经读取完毕,就根据之前保存的运算符 op 把 num 加到或减到 result 中,然后将 num 置零,并更新 op 为当前运算符;如果遇到空格则直接跳过不处理。循环结束后,还要再根据最后一次的运算符把最后一个 num 加入到 result 中,因为字符串末尾不一定有运算符。这样就可以完成整个表达式的求值。由于输入有多组数据,因此使用 while(getline(cin, s)) 循环读入直到文件结束,每读入一行就计算并输出结果。
整体代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
int a=0;
char op='+';
int result=0;
int num=0;
for(int i=0;i<s.length();i++){
if(s[i]=='+'){
if(op=='-'){
result-=num;
}else{
result+=num;
}
num=0;
op='+';
}else if(s[i]=='-'){
if(op=='-'){
result-=num;
}else{
result+=num;
}
num=0;
op='-';
}else if(s[i]>='0'&&s[i]<='9'){
num=num*10+(s[i]-'0');
}
}
if(op=='-'){
result-=num;
}else{
result+=num;
}
cout<<result<<endl;
}
return 0;
}
注意事项
- 注意字符串表达式前后末端的数字带来的问题。
删除字符
属于字符串的内容
题目
-
问题描述
从键盘输入一个字符串和一个字符,将输入字符从字符串中删除,输出新的字符串。如果字符串中没有此字符,则原样输出字符串。 -
输入说明
输入两行,第一行输入一个字符串,第二行输入一个字符。
字符串最多允许输入20个任意字符。 -
输出说明
输出删除字符后的字符串。 -
输入范例
ab ccdc
c -
输出范例
ab d
解题思路
- 本题思路是把第一行输入的整个字符串读入(注意字符串中可能包含空格,因此必须使用 getline 读取整行),再用 getline(cin, line)读第二行,要删除的字符就是 line[0](因为这一行只包含一个字符),然后遍历原字符串的每一个字符,如果当前字符不等于要删除的那个字符,就把它加入到一个新的字符串中;如果等于要删除的字符,则跳过不加入。遍历结束后输出新的字符串即可。
整体代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
string line;
getline(cin,s);//读取原字符包含空格
getline(cin,line);//读取要删除的字符(1个)包含空格
char ch=line[0];
string result="";
for(int i=0;i<s.length();i++){
if(s[i]!=ch){
result+=s[i];
}
}
cout<<result<<endl;
return 0;
}
注意事项
- 注意只要涉及"可能读入空格",就必须用 getline,不能用 cin >>。
英文段落翻译
自己翻译
在1950年代后期,晶体管在计算机当中的使用显著的表明了比真空管机器能达到的可能的逻辑元件更小,更快,更通用的逻辑元件的到来。因为晶体管使用更少的电力,并且拥有更长的寿命,这种单一提高对于叫做第二代计算机的提升是承担了一定责任的。零件变得更小,因此出现内部零件间隔,并且建造系统变得不那么昂贵。
集成电路
在1960年代后期,集成电路,或者说IC,被推出了,从而有可能将许多晶体管制作在一块硅衬底上,晶体管之间用覆镀在适当位置的导线相连接。集成电路的结果是一个在价格,尺寸和失败率上的更大的减少。在1970年代中期,随着大规模集成的电路板以及后来超大规模集成的电路板的出现,以及许多内部连接的晶体管时刻进了一个单独的硅衬底上,微处理器成为了一个现实。
回过来说,对于一个现代计算机的转换能力:在1970年代的计算机能够在一时刻处理八个转换。那就是说他们能够处理八个二进制逻辑位,或比特,的数据,在每一个循环中。一组巴比特叫做一个字节,每个字节包含了256个可能的开和关(或者1和0)的模式。每一个模式等于一个指令,一个指令的一部分,或者数据的一个特殊的类型,例如一个数字或者一个符号或者一个图形的象征。例如11010010这个模式,可能是二进制数据在这种情况下,十进制的数字是210,或者它可能是一个告知计算机去比较存储在它的存储在交换设备中的数据和存储在一个特定记忆芯片位置的数据的指令。
AI翻译
20世纪50年代末,晶体管在计算机中的应用标志着逻辑元件的重大革新:相比真空管机器,晶体管更小、更快、功能更丰富。由于晶体管功耗大幅降低、寿命显著延长,这一发展直接催生了被称为第二代计算机的改进型机器。元件尺寸不断缩小,元件间距也随之减小,系统的制造成本因而大幅降低。
4 . 集成电路
20世纪60年代末,集成电路(IC,见图1A-2)问世,使得众多晶体管得以制作在单个硅基片上,并通过电镀工艺实现互连导线的布置。集成电路进一步降低了成本、缩小了体积,并减少了故障率。20世纪70年代中期,随着大规模集成电路(LSI)及随后超大规模集成电路(VLSI)(即微芯片)的推出,成千上万个互联晶体管被蚀刻在单一的硅基片上,微处理器由此成为现实。
现在,让我们回到现代计算机的开关处理能力上来:20世纪70年代的计算机通常能够一次处理八个开关量。也就是说,它们在每个周期内可以处理八个二进制数字(即比特)的数据。八位二进制数构成一个字节,每个字节包含256种可能的开(1)与关(0)组合模式。每一种模式对应一条指令、指令的一部分,或某一特定类型的数据(如数字、字符或图形符号)。例如,模式11010010可以是二进制数据------在此例中代表十进制数210------也可以是一条指令,告诉计算机将其寄存器中存储的数据与某一内存芯片特定位置存储的数据进行比较。
单词打卡

下一篇
待续