这套题包含了历年真题,十分重要!!!要考试的同学可以参考一下!!希望能帮zhuyixia希望能帮助一下。
此套题限时3小时。
#C03L06P05. C03.L06.字符类型定义、读入、输出、应用.练习题1.数字和
题目描述
输入一个整数 n,求各位上的数字和。
输入格式
1 个整数 n,n 最多 200 位。
输出格式
一行一个整数,表示整数 n 的各位数字之和。
样例
输入数据 1
1234
Copy
输出数据 1
10
Copy
提示
由于n可能到 200 位,任何整数类型都是不可能存储的。因此,定义一个一维字符数组读取、存储这个超大数,然后把每个字符转换成数值累加求和。
代码
#include<bits/stdc++.h>
using namespace std;
string s;
long long a[255],ns;
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
a[++ns]=(s[i]-'0');
}
int s1=0;
for(int i=1;i<=ns;i++){
s1+=a[i];
}
cout<<s1;
return 0;
}
#C03L06P06. C03.L06.字符类型定义、读入、输出、应用.练习题2.乘法
题目描述
做厌了乘法计算题的佳佳,自创了一种新的乘法运算法则。在这套法则里,A×B 等于一个取自 A 、一个取自 B 、的所有数字对的乘积的和。
例如:123×45 等于 1×4+1×5+2×4+2×5+3×4+3×5=54 。
本题的任务是,对于给定的数 A 和 B ,用新的乘法法则计算 A×B 的值。
输入格式
一行两个用一个空格隔开的整数 A 和 B ,1 ≤ A 、B ≤ {10}^9109。
输出格式
一行一个整数,表示新的乘法法则下 A×B 的值。
样例
输入数据 1
123 45
Copy
输出数据 1
54
代码
#include<bits/stdc++.h>
using namespace std;
long long y=0;
string a,s;
int main()
{
cin>>a>>s;
for(int i=0;i<a.size();i++)
{
for(int j=0;j<s.size();j++)
{
y+=(a[i]-'0')*(s[j]-'0');
}
}
cout<<y;
return 0;
}
#C03L06P07. C03.L06.字符类型定义、读入、输出、应用.练习题3.比分(NHOI2017)
题目描述
小花在乒乓球馆里最喜欢一个叫樊振东的选手,今天它趴在窗户上看了一下午他们的训练,直到被打扫卫生的大叔赶走。小花的记性非常好,能够记录一整个下午的比赛情况,比如它记录的情况是(其中 F 表示樊振东选手获得一分,A 表示樊振东的对手获得一):
FFFFFFFFFFFFFFFFFFFFFFAF。在当前的赛制下,此时比赛的结果是樊振东第一局 11 比 0 获胜,第二局 11 比 0 获胜,正在进行第三局,当前比分 1 比 1。
因为小花看得太全神贯注了,完全没有注意比分,以至于它完全不知道一下午的具体比分,于是小花找了它的好朋友编程兔来帮忙。可是编程兔去挖萝卜了,于是小花来求助聪明的小朋友们。
你的程序就是要对于一系列比赛信息的输入(FA 形式),输出正确的结果。
注:
- 当前使用的是 11 分制,到 10 平后,需要胜出 2 分后,才算胜,如:12:10;17:15 等。
- 如果一局比赛刚开始,则此时比分不必输出。
- 输入数据每行至多 20 个字母,行数可能很多,最多可能有 10000 行。
输入格式
输入包含若干行字符串(每行至多 20 个字母),字符串由大写的 F、A 和 E 组成,没有其他多余的字母。
其中 E 表示比赛信息结束,程序应该忽略 E 之后的所有内容。
数据范围
对于 30%的数据,输入只有一行。
对于 60%的数据,输入不超过 10 行。
对于 100%的数据,输入数据不超过 10000 行。
输出格式
输出有若干行,每一行对应一局比赛的比分(按输入顺序)。
样例
输入数据 1
FFFFFFFFFFFFFFFFFFFF
FFAFE
Copy
输出数据 1
11:0
11:0
1:1
Copy
样例解释
前 11 分都是 F,所以第一局 11:0,之后 11 分也都是 F,所以第二句也是 11:0,最后两分分别是 A 和 F,所以是 1:1,E 表示结束。
代码
#include<bits/stdc++.h>
using namespace std;
char a;
int t,d;
int main(){
a=getchar();
while(a!='E'){
if(a=='F')t++;
else if(a=='A')d++;
if((t<11&&d<11)||abs(t-d)<2){
}else{
printf("%d:%d\n",t,d);
t=0;
d=0;
}
a=getchar();
}
if(t+d>0){
printf("%d:%d\n",t,d);
}
return 0;
}
#C03L06P08. C03.L06.字符类型定义、读入、输出、应用.练习题4.过滤多余的空格
题目描述
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入格式
一行,一个字符串(长度不超过200),句子的头和尾都没有空格。
输出格式
过滤之后的句子。
样例
输入数据 1
Hello world.This is c language.
Copy
输出数据 1
Hello world.This is c language.
代码
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
getline(cin,s);
for(int i=0;i<s.size();i++)
{
if(s[i]==' '&&s[i-1]!=' ')
{
cout<<' ';
}
else if(s[i]!=' ')
{
cout<<s[i];
}
}
return 0;
}
#C03L06P09. C03.L06.字符类型定义、读入、输出、应用.附加题1.出现第一次的字符
题目描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出 no。
输入格式
一个字符串,长度小于 10000 。
输出格式
输出第一个仅出现一次的字符,若没有则输出 no。
样例
输入数据 1
abcabd
Copy
输出数据 1
c
代码
#include<bits/stdc++.h>
using namespace std;
string s;
char a[20002];
int main()
{
cin>>s;
for(char i='a';i<='z';i++)
{
s[i]=0;
}
for(int i=0;i<s.size();i++)
{
a[s[i]]++;
}
for(int i=0;i<s.size();i++)
{
if(a[s[i]]==1)
{
cout<<s[i];
return 0;
}
}
cout<<"no";
return 0;
}
#C03L06P10. C03.L06.字符类型定义、读入、输出、应用.附加题2.猜拳游戏
题目描述
石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。
游戏规则:石头打剪刀,布包石头,剪刀剪布。
现在,需要你写一个程序来判断石头剪子布游戏的结果。
输入格式
第一行是一个整数 N ,表示一共进行了 N 次游戏。1 <= N <= 100。
接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):
S1 S2
字符串之间以空格隔开 S1 , S2 只可能取值在 { "Rock", "Scissors", "Paper" } (大小写敏感) 中。
输出格式
输出包括N行,每一行对应一个胜利者( Player1 或者 Player2 ),或者游戏出现平局,则输出 Tie。
样例
输入数据 1
3
Rock Scissors
Paper Paper
Rock Paper
Copy
输出数据 1
Player1
Tie
Player2
代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s1,s2;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s1>>s2;
if((s1=="Rock"&&s2=="Scissors")||(s1=="Scissors"&&s2=="Paper")||(s1=="Paper"&&s2=="Rock"))
{
cout<<"Player1"<<endl;
}
else if(s2==s1)
{
cout<<"Tie"<<endl;
}
else
{
cout<<"Player2"<<endl;
}
}
return 0;
}
#C03L07P04. C03.L07.字符串入门.练习题1.游客统计
题目描述
漫画馆是很多小朋友喜欢去游玩的地方,为了方便统计游客的数量,在漫画馆的出入口设置了一些 装置用来记录游客进出的情况。某天漫画馆关门的时候用来统计游客数据的机器突然坏了,现在只知道 整天出入漫画馆的情况,由一串 I 和 O 的代码来表示,I 表示有一个人进入漫画馆,O 表示一个人离开 漫画馆。馆长的小助手琳琳希望知道这天最多有多少个游客同时在漫画馆里面参观,你能帮助琳琳解决这个问题吗?
输入格式
一行一个字符串,全都有 O 和 I 这两组字符组成。
数据范围
对于 50% 的数据 字符串长度小于 200
对于 100% 的数据 字符串长度小于 10000
保证在馆人数不会出现负数。
输出格式
最多同时在漫画馆的人数。
样例
输入数据 1
IIIOOIIOIOOO
Copy
输出数据 1
3
代码
#include<bits/stdc++.h>
using namespace std;
long long c[10010],b=0;
string s;
//char ;
int main(){
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]=='I'){
b+=1;
}
else if(s[i]=='O'){
b-=1;
}
c[i]=b;
}
int ma=INT_MIN;
for(int i=1;i<=len;i++){
if(c[i]>ma){
ma=c[i];
}
}
cout<<ma;
return 0;
}
#C03L07P05. C03.L07.字符串入门.练习题2.统计字母
题目描述
输入一行长度不超过{10}^5105 的字符串(可能有空格),统计小写字母出现的次数。
输入格式
一行字符串,长度 < {10}^5105 。
输出格式
一个整数。
样例
输入数据 1
Ab 12394094 ef***
Copy
输出数据 1
3
代码
#include<bits/stdc++.h>
using namespace std;
long long c[10010],b=0;
string s;
//char ;
int main(){
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]=='I'){
b+=1;
}
else if(s[i]=='O'){
b-=1;
}
c[i]=b;
}
int ma=INT_MIN;
for(int i=1;i<=len;i++){
if(c[i]>ma){
ma=c[i];
}
}
cout<<ma;
return 0;
}
#C03L07P06. C03.L07.字符串入门.练习题3.元音字母(NHOI2017初中)
题目描述
给你一个所有字符都是字母的字符串,请输出其中元音字母的个数。
提示
二十六个字母中的五个元音字母是a,e,i,o,u;所有字符有大小写区别。
输入格式
仅一行,包括一个字符串。
数据规模
对于100%的数据,字符串长度小于等于 {10}^6106 。
输出格式
输出一个整数,如题所述。
样例
输入数据 1
helloworld
Copy
输出数据 1
3
代码
#include<bits/stdc++.h>
using namespace std;
string n;
int main()
{
getline(cin, n);
int a[5]={ 0 };
for(int i=0;i<n.size();i++)
{
if(n[i]=='a'||n[i]=='e'||n[i]=='i'||n[i]=='o'||n[i]=='u'||n[i]=='A'||n[i]=='E'||n[i]=='I'||n[i]=='O'||n[i]=='U')
{
a[0]++;
}
}
cout<<a[0];
return 0;
}
#C03L07P07. C03.L07.字符串入门.练习题4.亲朋字符串
题目描述
编写程序,求给定字符串s的亲朋字符串 s1 。
亲朋字符串 s1 定义如下:
给定字符串 s 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到第一个亲朋字符;
给定字符串 s 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到第二个亲朋字符;
依此类推,直到给定字符串 s 的倒数第二个字符。
亲朋字符串的最 后一个字符由给定字符串 s 的最后一个字符 ASCII 值加 s 的第一个字符的 ASCII 值。
输入格式
输入一行,一个长度大于等于 2 ,小于等于 100 的字符串。字符串中每个字符的ASCII值不大于 63 。
输出格式
输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。
样例
输入数据 1
1234
Copy
输出数据 1
cege
代码
#include<stdio.h>
#include<string.h>
int main()
{
int i,len;
char s[101]={0},s1[101]={0};
gets(s);
len=strlen(s);
for(i=0;i<len;i++){
if(i==len-1){
s1[i]=s[i]+s[0];
}
if(i<len-1){
s1[i]=s[i]+s[i+1];
}
}
puts(s1);
return 0;
}
#C03L07P09. C03.L07.字符串入门.附加题2.删数字
题目描述
奶牛在数学课上学习了整除的概念。农夫 Farmer John 为了考验它的数学水平,于是在白纸上写了正整数 T。由于农夫不喜欢数字 0,所以正整数 T 是不含数字 0 的。奶牛可以删除 T 的若干位数字,剩下来的数字从左到右构成一个正整数 P,使得正整数 P 必须是 5 的倍数。奶牛有多少种不同的删除方案?具体请看样例解释。
输入格式
一个正整数 T。
输出格式
一个整数,奶牛不同的删除方案数。
注意事项
奶牛可以删除 0 个数字(即不删除任何数字)。
奶牛不能把 T 全部删除掉。即至少要剩下 1 位数字。
由于 T 的位数可能较长,建议用字符串形式读入,详细见样例三。
样例
输入数据 1
1256
Copy
输出数据 1
4
Copy
输入数据 2
115
Copy
输出数据 2
4
Copy
输入数据 3
1234567899876543211234567891234667891234667895
Copy
输出数据 3
35184376291344
Copy
样例解释
- 样例1
奶牛有 4 种不同的删除方案:
第 1 种方案:删除T 的第四位数字,剩下的P=125,是 5 的倍数。
第 2 种方案:删除T 的第一位和第四位数字,剩下的P=25,是 5 的倍数。第 3 种方案:删除T 的第二位和第四位数字,剩下的P=15,是 5 的倍数。
第 4 种方案:删除T 的第一位、第二位、第四位数字,剩下的P=5,是 5 的倍数。
- 样例2
奶牛有 4 种不同的删除方案:
第 1 种方案:不删除任何数字,剩下的P=115,是 5 的倍数。
第 2 种方案:删除T 的第一位数字,剩下的P=15,是 5 的倍数。第 3 种方案:删除T 的第二位数字,剩下的P=15,是 5 的倍数。
第 4 种方案:删除T 的第一位、第二位数字,剩下的P=5,是 5 的倍数。
数据范围
测试点序号 | 数据说明 |
---|---|
样例1 | T 是两位数 |
样例2 | T 是两位数 |
样例3 | T 是三位数 |
样例4 | T 是三位数 |
样例5 | T 的位数的范围是 30 位至 60 位 |
样例6 | T 的位数的范围是 30 位至 60 位 |
样例7 | T 的位数的范围是 30 位至 60 位 |
样例8 | T 的位数的范围是 30 位至 60 位 |
样例9 | T 的位数的范围是 30 位至 60 位 |
样例10 | T 的位数的范围是 30 位至 60 位 |
温馨提示
后 6 个测试点,答案可能较大,C++的请用 long long 类型。
代码
#include<bits/stdc++.h>
using namespace std;
long long mi2(int k)
{
long long t=1;
for(int i=0;i<k;i++)
{
t*=2;
}
return t;
}
int main()
{
long long ans=0;
string t;
cin>>t;
int len=t.size();
for(int i=0;i<len;i++)
{
if(t[i]!='5')
{
continue;
}
ans+=mi2(i);
}
cout<<ans;
return 0;
}
#C03L09P04. C03.L09.getline、erase、insert()函数.练习题1.棋子(DLOI2019xj)
题目描述
棋盘从左往右分成 N 个格子。棋盘上有且仅有 1 只白色棋子(‘W’表示白旗)和零个或多个黑色棋子(‘B’ 表示黑旗)。在游戏开始时,白棋放置在棋盘的第 1 个格子上,黑棋放置在其他格子上,一个棋子占据一 个格子。没有棋子的格子为空(用‘-’表示)。
FJ 然后开始移动白棋,他的每一步都可以做以下两件事之一(不能做其他事):
如果白旗的右邻居格子为空,FJ 会将白棋向右移动一个格子。
如果白旗的右邻居格子是黑棋,且该黑棋的右邻居为空,那么 FJ 会将白棋移动到该黑棋的右邻居。
FJ 一直重复上述操作,直到不能移动为止。
给定棋盘的初始状态,请输出游戏的最终状态。
输入格式
一个长度不超过 50 的字符串 S,表示棋盘的初始状态。‘W’表示白旗,‘B’表示黑旗,-’表示空格子。
输出格式
一个字符串,表示棋盘的最终状态。
样例
输入数据 1
WB-B-B-
Copy
输出数据 1
-B-B-BW
Copy
输入数据 2
W--BB---
Copy
输出数据 2
--WBB---
Copy
输入数据 3
W
Copy
输出数据 3
W
Copy
输入数据 4
W-B--B---BB-
Copy
输出数据 4
--B--B--WBB-
代码
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i+1]=='-')
{
s[i]='-';
s[i+1]='W';
}
else if(s[i+1]=='B'&&s[i+2]=='-')
{
s[i]='-';
s[i+2]='W';
i++;
}
else
{
cout<<s;
return 0;
}
}
cout<<s;
return 0;
}
#C03L10P01. C03.L10.字符串的简单处理.练习题1.ISBN号码(noip)
题目描述
每一本正式出版的图书都有一个 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号码(包括分隔符 “-” )。
样例
输入数据 1
0-670-82162-4
Copy
输出数据 1
Right
Copy
输入数据 2
0-670-82162-0
Copy
输出数据 2
0-670-82162-4
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[13];
int s[10];
int t=0,k=0,mod=0;
for(int i=0;i<13;i++)
{
cin>>str[i];
}
for(int j=0;j<13;j++)
{
if(str[j]!='-') {
s[k]=str[j]-48;
k++;
}
}
for(int i=0,j=1;i<9;i++,j++ )
{
t+=s[i]*j;
}
mod=t%11;
if(str[12]=='X')
{
str[12]=10;
}
else
{
str[12]=str[12]-48;
}
if(mod==str[12])
{
cout<<"Right";
}
else{
for(int x=0;x<12;x++)
{
cout<<str[x];
}
if(mod==10)
{
cout<<'X';
}
else
{
cout<<mod;
}
}
return 0;
}
#C03L11P02. C03.L11.字符计数.练习题2.美人松的高度.1
题目描述
又到过年了,狗熊岭的动物们都忙碌了起来,张灯结彩准备过年。李老板却要光头强砍一些百年美人松回去。现在光头强看到丛林里有N棵美人松,当然每棵松的高度是已知的。李老板要问光头强:高度为K的美人松有多少棵?
输入格式
第一行一个正整数N, 1 <= N <= 1000000 。
第二行 N 个正整数,之间用一个空格隔开,表示N棵美人松的高度,1<=高度<=1000000。
第三行一个正整数 K ,表示询问高度为 K 的美人松有多少棵。
输出格式
一行一个整数,表示对应高度为K的树的数量,如果没有则输出0。
样例
输入数据 1
5
3 4 5 2 3
3
Copy
输出数据 1
2
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[1000005],c,y=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cin>>c;
for(int i=0;i<n;i++)
{
if(a[i]==c)
{
y++;
}
}
cout<<y;
return 0;
}
#C03L12P03. C03.L12.进制转换.练习题2.将X进制转换成十进制
题目描述
输入一个 X 进制数 N ,将其转换成十进制输出。
输入格式
2 个整数:N,X,用空格隔开,表示将 X 进制数 N ,转换成十进制数 ( 2 <= X <= 16 )。
输出格式
1 个整数:表示转换得到的十进制数
样例
输入数据 1
ABCDEF 16
Copy
输出数据 1
11259375
代码
#include<bits/stdc++.h>
using namespace std;
int a(char f) {
if(f>='0' && f<='9')
{
return int(f - '0');
}
return 10 + int(f - 'A');
}
int main() {
int x;
string n;
cin>>n>>x;
long long t = 1, j = 0;
int h=n.size();
for(int i=h-1;i>-1;i--) {
int y = a(n[i]);
j+=y*t;
t*=x;
}
cout<<j;
return 0;
}
#C03L12P05. C03.L12.进制转换.练习题4.十进制转X进制
题目描述
将十进制数 N 转换成 X 进制数,并输出转换后的 X 进制数。
输入格式
2 个数:N,X,将 N 转换成 X 进制数( 0<=N<=1000000000000 , 2 <= X <= 16 )
输出格式
1 个数:表示转换得到的 X 进制数
样例
输入数据 1
123 16
Copy
输出数据 1
7B
代码
#include<bits/stdc++.h>
using namespace std;
char ZhuanHuanChengZiFu(int ShuZi) {
if(ShuZi<10) return '0'+ShuZi;
return 'A'+(ShuZi-10);
}
int main() {
long long N;
int X;
cin >> N >> X;
if(N==0) {
cout << N;
return 0;
}
string xJinZhiShu = "";
int yuShu;
while(N>0) {
yuShu = N%X;
N /= X;
xJinZhiShu += ZhuanHuanChengZiFu(yuShu);
}
int ChangDu = xJinZhiShu.size();
for(int i=ChangDu-1; i>-1; i--)
cout << xJinZhiShu[i];
return 0;
}
谢谢观看!!!