Hello大家好,我是阳了个阳C++,今天又给大家带来了两篇题解
另外大家可以猜一猜我为什么这么久不更新(绝对不是因为懒)
P1055:
题目描述
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如 x-xxx-xxxxx-x
,其中符号 -
就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4
就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 0 代表英语;第一个分隔符 -
之后的三位数字代表出版社,例如 670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以 1 加上次位数字乘以 2 ……以此类推,用所得的结果 mod 11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例如 ISBN 号码 0-670-82162-4
中的识别码 4 是这样得到的:对 067082162
这 9 个数字,从左至右,分别乘以 1,2,…,9 再求和,即 0×1+6×2+……+2×9=158,然后取 158 mod 11 的结果 4 作为识别码。
你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right
;如果错误,则输出你认为是正确的 ISBN 号码。
输入格式
一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。
输出格式
一行,假如输入的 ISBN 号码的识别码正确,那么输出 Right
,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 -
)。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int cnt=0;
int j=1;
for(int i=0;i<11;i++){
if(s[i]=='-') continue;
cnt+=(s[i]-'0')*j;
j++;
}
int tmp;
if(s[12]=='X') tmp=10;
else tmp=s[12]-'0';
cnt%=11;
if(cnt==tmp){
cout<<"Right";
}else{
for(int i=0;i<=11;i++){
cout<<s[i];
}
if(cnt==10){
cout<<"X";
}else{
cout<<cnt;
}
}
return 0;
}
P1059:
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
输入有两行,第 1 行为 1 个正整数,表示所生成的随机数的个数 N。
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。
第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
这道题最简单的方法就是set,可以直接秒掉
如果不会用set就先排序再逐个做去重,会麻烦一些,不过也能做
set做法代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[109];
set<int> s;
set<int>::iterator it;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
s.insert(a[i]);
}
cout<<s.size()<<endl;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
return 0;
}
今天的题解就到这里,谢谢大家的观看!
别忘了点个赞哦!