回文数2
属于字符串的内容
题目
-
问题描述
有一天,明明正在做作业,发现了一组很有趣的数字,例如1、11、313等等。他发现这些数字都是左右对称的,即不论你把这些数字从左读到右还是从右读到左,读出来的数字都是一样的。于是明明就把这个发现告诉了他爸爸。明明的爸爸是一名数学家,对此类型数字早有研究。他对明明说:"这些是回文数,是一种特殊的数字,即这些数字的左右两边是对称的。例如:11左右两边对称,313左右也是对称的。" 明明觉得这很有趣,接着问他爸爸还有什么和这类回文数有关的有趣的东西。明明的爸爸就说:"你把这些回文数转换成二进制数,看看是不是也符合回文数的规则。"明明发现1的二进制数也是1,符合回文数的规则;11的二进制数是1011,不符合回文数的规则;33的回文数是100001,符合回文数的规则。明明就回答爸爸说:"1和33的二进制数符合回文数的规则,11的二进制数则不符合回文数的规则。" 明明爸爸很满意明明的回答,又给了明明很多十进制数,让他判断在这些数中哪些数既是十进制回文数又是二进制回文数。明明起先做起来很有意思,但是时间一长就失去了兴趣。他想请你帮个忙,帮他写一个程序,用来判断一个数,它的十进制数是回文数,且它的二进制数也是回文数。
明明的问题可以归结为:给你一个整数(十进制),判断该整数的十进制数和它的二进制数是否全为回文数。 -
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有一个整数N(0 <= N <= 1000),表示要判断回文数的那个数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 -
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为"Yes"或"No",如果该数的十进制数和二进制数都是回文数,则输出"Yes"(不含双引号),否则输出"No"(不含双引号)。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。 -
输入范例
1
10
33 -
输出范例
Yes
No
Yes
解题思路
- 本题思路是分别判断一个数在十进制表示和二进制表示下是否都是回文数。首先读入一个整数,将该整数转换成字符串形式,用双指针的方法判断十进制字符串是否左右对称;如果十进制不是回文,则直接输出"No"。如果十进制是回文,则继续将该整数转换为二进制字符串,可以通过不断对2取余并倒序得到二进制表示,然后再用同样的双指针方法判断二进制字符串是否回文。只有当十进制和二进制两种表示形式都满足回文条件时输出"Yes",否则输出"No"。
整体代码
cpp
#include <bits/stdc++.h>
using namespace std;
// 判断字符串是否为回文
bool isPalindrome(const string &s) {
int l = 0, r = s.length() - 1;
while (l < r) {
if (s[l] != s[r]) return false;
l++;
r--;
}
return true;
}
// 将十进制数转换为二进制字符串
string toBinary(int n) {
if (n == 0) return "0";
string s = "";
while (n > 0) {
s += (n % 2) + '0';
n /= 2;
}
reverse(s.begin(), s.end());
return s;
}
int main() {
int n;
while (cin >> n) {
// 十进制转字符串
string dec = to_string(n);
// 判断十进制是否回文
if (!isPalindrome(dec)) {
cout << "No" << endl;
continue;
}
// 转二进制并判断
string bin = toBinary(n);
if (isPalindrome(bin)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
注意事项
- 注意二进制转换时要特殊处理n=0,否则会得到空字符串。
加法器
属于字符串的内容
题目
-
问题描述
明明读小学的时候,不喜欢数学,尤其是不喜欢做加法,一做加法就头疼,这样导致明明长大后数学依然不好,而且对数字产生了抵触心理。可是不巧的是,明明进了一家会计公司,每天都要计算很多数据,在这些计算中加法运算居多,而且这些加法不只是是两个数之间的加法,更有多个数的连加。 例如:1+2+3的正确答案是6。 这给明明造成了很大的麻烦。你是明明的好朋友,看到明明如此痛苦,就产生了帮助明明的想法。你想帮明明写一个程序,这个程序能计算一串正整数的连加,从而帮助明明摆脱数字的困扰。 明明的问题可以归结为:给你一串正整数的连加表达式,完成这个表达式的计算。 -
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有一个表达式,表达式由正整数和加号("+")组成,不含其他任何符号,表达式中的数字小于等于30000,表达式的长度不超过1000,具体格式见输入样例。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 -
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即表达式的值。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。 -
输入范例
1+2+3
5+111 -
输出范例
6
116
解题思路
- 由于输入的是一个只包含正整数和"+"号的表达式,可以先按行读取整行字符串,然后从左到右遍历字符串,逐字符解析数字。当遇到数字字符时,将当前数字累积构造(当前值 = 当前值 × 10 + 数字);当遇到"+"时,说明前一个完整的数字已经结束,将该数字加入总和中,并把当前数字清零,继续处理后面的部分。遍历结束后,还需要把最后一个数字加入总和中。
整体代码
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
// 按行读取,直到输入结束
while (getline(cin, s)) {
long long sum = 0; // 保存结果
long long num = 0; // 当前正在解析的数字
for (int i = 0; i < s.length(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
// 构造多位数
num = num * 10 + (s[i] - '0');
} else if (s[i] == '+') {
// 一个数字结束,加入总和
sum += num;
num = 0;
}
}
// 最后一个数字需要加入
sum += num;
cout << sum << endl;
}
return 0;
}
注意事项
- 注意遍历结束后不要忘记把最后一个数字加入总和,否则结果会少一项。
构造序列
属于字符串的内容
题目
-
问题描述
序列是在数学世界中一种非常有趣的数字现象,它通过某一规则来产生数字,使数字变得有趣、变幻无穷。很多数学家对序列这种事物产生了浓厚的兴趣,花了很多时间对其进行研究,明明就是其中的一位。一天,他又在研究一种新的序列产生规则,该序列的规则如下:
1) 第1轮,写出两个1,即11;
2) 第2轮,在它们中间插入2,成为121;
3) 第3轮,在上面数中每两个相邻的和为3的数之间插入3,成为13231;
4) 以此类推下去,第n轮,在第n-1轮的数字的基础上,每两个相邻的和为n的数之间插入n。
明明根据这个规则开始构造序列。开始还觉得容易,但是越到后面,明明发现构造序列的计算量越来越大,计算难度也越来越高,计算速度也越来越慢。于是,明明就求助于你这位程序设计专家,能否帮他写一个程序,构造出序列的前9项,然后当明明需要知道序列中的哪一项的时,你就把那一项的数字告诉明明。
明明的问题可以归结为:根据题目描述中所描述的序列产生规则构造序列的前9项,然后告诉你一个正整数n,要求你输出序列的第n项。 -
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤9),代表之后所要求的序列的第n项的值。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 -
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即所要求的序列中那一项的数值,每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。 -
输入范例
3
4
5 -
输出范例
13231
1432341
15435253451
解题思路
- 本题思路是利用字符串逐轮构造的方法进行处理。根据题目规则,第1轮序列为固定的字符串"11",从第2轮开始,在上一轮结果的基础上进行生成:从左到右遍历上一轮字符串,对于每一对相邻字符,先保留当前字符,然后判断这两个字符对应的数字之和是否等于当前轮数n,如果相等,则在它们中间插入数字n;依次处理所有相邻字符,最后再加入原字符串的最后一个字符,即可得到第n轮结果。由于题目要求的n范围为1到9,可以先按照上述规则预先构造出前9项并保存起来,之后对于每次输入的n,直接输出对应的结果即可,从而提高程序效率并简化实现。
整体代码
cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
// 存储前9项
vector<string> seq(10);
seq[1] = "11";
// 预处理构造第2到第9项
for (int n = 2; n <= 9; n++) {
string prev = seq[n - 1];
string cur = "";
for (int i = 0; i < prev.length(); i++) {
cur += prev[i]; // 先加入当前字符
// 如果不是最后一个字符,判断是否需要插入
if (i < prev.length() - 1) {
int a = prev[i] - '0';
int b = prev[i + 1] - '0';
if (a + b == n) {
cur += char(n + '0');
}
}
}
seq[n] = cur;
}
// 多组输入
int n;
while (cin >> n) {
cout << seq[n] << endl;
}
return 0;
}
注意事项
- 注意由于题目要求 n ≤ 9,可以先预处理前9项。
英文段落翻译
自己翻译
三、理论和实验
计算机科学是一个理论工程和实验的结合体。一些情况下,一个计算机科学家开创了一个理论,然后然后建立了基于那个理论的计算机硬件和软件结合的工程,然后实验性的尝试它。这样一个理论驱动的方式的例子是之后在实际应用中有价值的新的软件工程工具的开发。在另外一些情况中,实验可能导致新的理论,例如一个人工神经网络展示了和在大脑中的神经元相似的行为的发现导致了在神经生理学的一个新的理论。
似乎计算机的预测天赋使得实验变得不必要了,因为实验的结果被提前知道了。但是当计算机系统和他们与自然世界的交互变得充满复杂,可能会出现意外的行为。因此,实验和传统的科学方法都是计算机科学的关键部分。
四、计算机科学的主要分支
计算机科学可以被分为四个主要领域:软件开发,计算机体系结构(硬件),人机接口(为了人类使用计算机更加有效率的设计),以及人工智能(尝试让计算机表现的智能)。软件开发主要是创建运行十分有效的计算机项目。计算机体系结构主要是为特定的计算机的需要开发最优的硬件。人工智能的领域和人机接口通常包含了从软件和硬件的开发到解决实际问题。
AI翻译
三、理论与实验
计算机科学是理论、工程与实验的结合。在某些情况下,计算机科学家先提出一种理论,然后基于该理论设计出计算机硬件与软件的组合方案,并通过实验对其进行测试。这种理论驱动方法的一个例子是,开发出新的软件工程工具,随后在实际使用中对其进行评估。在另一些情况下,实验也可能催生新的理论,例如,人工神经网络表现出与人脑神经元相似的行为这一发现,便为神经生理学带来了新的理论见解。
计算机的可预测性似乎使实验变得多余,因为实验结果似乎理应可以预先知晓。然而,当计算机系统及其与自然界的交互变得足够复杂时,便可能产生无法预见的行为。因此,实验与传统科学方法成为计算机科学的关键组成部分。
四、计算机科学的主要分支
计算机科学可分为四大主要领域:软件开发、计算机体系结构(硬件)、人机交互(设计人类使用计算机的最有效方式)以及人工智能(试图让计算机表现智能)。软件开发致力于创建能高效运行的程序。计算机体系结构专注于为特定计算需求开发最优化的硬件。人工智能与人机交互领域通常涉及软件与硬件的协同开发,以解决特定问题。
单词打卡

下一篇
待续