12.斯诺登的密码
题目:
alt text
代码:
include
include
using namespace std;
/
1.输入,string 先对格式不做要求
2.找数字 存入数组中,利用for循环遍历 存储到数组
3.平方 取模 去0
/
int main(){
string s[6];
string snum[26] = {“one”,”two”,”three”,”four”,”five”,”six”,”seven”,”eight”,”nine”,”ten”,”eleven”,”twelve”,”thirteen”,”fourteen”,”fifteen”,”sixteen”,”seventeen”,”eighteen”,”nineteen”,”twenty”,”a”,”both”,”another”,”first”,”second”,”third”};
int num[26] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,1,1,2,3};
int data[6] = {0};
int j = 0;
for(int i = 0; i < 6; i++){
cin>>s[i];
for(int k = 0; k < 26; k++){ //为什么边界是26
if(s[i] == snum[k] && (num[k] * num[k]) % 100 != 0){
data[j] = (num[k] * num[k]) % 100;
j++;
break;
}
}
}
if(j == 0){
cout<<0;
return 0;
}
sort(data, data + j);
for(int i = 0; i < j; i++){
if(i != 0 && data[i] < 10){
cout<<0;
}
cout<<data[i];
}
return 0;
}
错误原因:
没有彻底搞清楚题目,导致走了很多弯路,简单问题复杂化
知识点 + 疑惑点:
string snum[26] 有26个元素,数组下标仍然为26.不为25,循环时,从0开始,K < 26, for(int k = 0; k < 26; k++)
解答:元素个数比下标大一 有26个元素,下标为0 ~ 25
在C和C++中,定义一个数组时,需要指定数组的大小,而不是数组中元素的数量。因此,当您定义数组时,需要指定数组的大小,以便为所有元素提供足够的空间。在定义数组时,指定数组的大小应该是数组中元素的数量,而不是最后一个元素的索引。
知识补充;
代码:
include
include
include
include
include
using namespace std;
map
const int mx=66;
int top;
int st[mx];
string s;
int main(){
q["one"]=1;q["two"]=2;q["three"]=3;q["four"]=4;q["five"]=5;q["six"]=6;q["seven"]=7;q["eight"]=8;q["nine"]=9;q["ten"]=10;
q["eleven"]=11;q["twelve"]=12;q["thirteen"]=13;q["fourteen"]=14;q["fifteen"]=15;q["sixteen"]=16;q["seventeen"]=17;q["eighteen"]=18;q["nineteen"]=19;q["twenty"]=20;
q["a"]=1;q["both"]=2;q["another"]=1;q["first"]=1;q["second"]=2;q["third"]=3;
//打表
for(int i=1;i<=6;i++){
cin>>s;
if(q[s]){//如果可以构成数字
int k=q[s]*q[s]%100;
if(k==0)continue;//要是为0就没有必要存了
st[++top]=k;
}
}
sort(st+1,st+top+1);//从小到大排
cout<<st[1];
for(int i=2;i<=top;i++){
if(st[i]<10)cout<<0;//不这样只能拿10分
cout<<st[i];
}
return 0;
}
知识点:map
1.定义:map
eg:map
2.使用/初始化:myMap[key] = value; 变量名[第一个元素值] = 第二个元素值;
eg: q[“one”]=1; q[“two”]=2; q[“three”]=3;
3.定义和特性
键值对:map 存储的是键值对,其中每个键都是唯一的。
排序:map 中的元素按照键的顺序自动排序,通常是升序。
唯一性:每个键在 map 中只能出现一次。
双向迭代器:map 提供了双向迭代器,可以向前和向后遍历元素。
- 访问元素:value = myMap[key];
eg: int k=q[s]*q[s]%100;
5.遍历元素:
for (map
cout << it->first << “ => “ << it->second << endl;
}
实例
下面是一个使用 map 的简单实例,我们将创建一个 map 来存储员工的姓名和他们的年龄,并遍历这个 map 来打印每个员工的姓名和年龄。
实例
include #include
include
int main() {
// 创建一个 map 容器,存储员工的姓名和年龄
std::map
// 插入员工信息
employees["Alice"] = 30;
employees["Bob"] = 25;
employees["Charlie"] = 35;
// 遍历 map 并打印员工信息
for (std::map<std::string, int>::iterator it = employees.begin(); it != employees.end(); ++it) {
std::cout << it->first << " is " << it->second << " years old." << std::endl;
}
return 0;
}
输出结果:
Alice is 30 years old.
Bob is 25 years old.
Charlie is 35 years old.
进阶用法
6.检查键是否存在:
if (myMap.find(key) != myMap.end()) {
// 键存在
}
7.删除元素:
myMap.erase(key);
8.清空:
myMap.clear();
9.获取 map 的大小:
size_t size = myMap.size();
10.使用自定义比较函数:
实例
include
include
include
bool myCompare(const std::string& a, const std::string& b) {
return a < b;
}
int main() {
std::map
// 其他操作...
return 0;
}