笨小猴
题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn
是单词中出现次数最多的字母的出现次数,minn
是单词中出现次数最少的字母的出现次数,如果maxn-minn
是一个质数,那么笨小猴就认为这是个Lucky Word
,这样的单词很可能就是正确的答案。
输入格式
一个单词,其中只可能出现小写字母,并且长度小于100。
输出格式
共两行,第一行是一个字符串,假设输入的的单词是Lucky Word
,那么输出“Lucky Word
”,否则输出“No Answer
”;
第二行是一个整数,如果输入单词是Lucky Word
,输出maxn-minn
的值,否则输出0。
输入
error
输出
Lucky Word 2
输入
olympic
输出
No Answer 0
说明/提示
【1解释】
单词error
中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3−1=2,2是质数。
【2解释】
单词olympic
中出现最多的字母i出现了1次,出现次数最少的字母出现了1次,1−1=0,0不是质数。
#include<iostream>
using namespace std;
//笨小猴
#include<cstring>
#include<algorithm>
#include<cmath>
bool isprime(int n){
if(n==0||n==1) return false;//注意判断0和1!!!
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return false;
return true;
}
int a[27];//a[1]表示a的个数,一次类推
int main()
{
string s;
int minn,maxn;
cin>>s;
memset(a,0,sizeof(a));
for(int i=0;i<s.size();i++){
a[s[i]-'a'+1]++;
}
sort(a+1,a+27);
maxn=a[26];
for(int i=1;i<27;i++){
if(a[i]!=0){
minn=a[i];
break;
}
}
if(isprime(maxn-minn)) cout<<"Lucky Word"<<endl<<maxn-minn<<endl;
else cout<<"No Answer"<<endl<<0<<endl;
return 0;
}
口算练习题
题目描述
王老师正在教简单算术运算。细心的王老师收集了i道学生经常做错的口算题,并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如5+8的算式最好只要输入5和8,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 5+8=13 以及该算式的总长度6。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。
输入格式
第一行为数值i
接着的i行为需要输入的算式,每行可能有三个数据或两个数据。
若该行为三个数据则第一个数据表示运算类型,a表示加法运算,b表示减法运算,c表示乘法运算,接着的两个数据表示参加运算的运算数。
若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。
输出格式
输出2*i行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度
输入
4 a 64 46 275 125 c 11 99 b 46 64
输出
64+46=110 9 275+125=400 11 11*99=1089 10 46-64=-18 9
说明/提示
数据规模与约定
0<i<=50
运算数为非负整数且小于10000
对于50%的数据,输入的算式都有三个数据,第一个算式一定有三个数据。
cstdio: sscanf,sprintf
#include<iostream>
using namespace std;
//口算练习题
#include <cstring> //memset & strlen 用cstring
#include <cstdio> //sscanf & sprintf 用cstdio
int main()
{
int n,m1,m2;
char op,s[100],b[10];//操作数不超过10000
cin>>n;
while(n--){
cin>>b;//输入一串字符,可能是字母或数字
if(b[0]=='a'||b[0]=='b'||b[0]=='c'){
op=b[0];//op保存当前操作符直到下一个操作符出现
cin>>m1>>m2;//再输入两个操作数
}else{
sscanf(b,"%d",&m1);//将s转换成int型数字存在第一个数中
cin>>m2;//再输入第二个人数
}
memset(s,0,sizeof(0));//清空s,"%d":占位符,里面的d不能换成其他~~~
if(op=='a') sprintf(s,"%d+%d=%d",m1,m2,m1+m2);//格式化输出
if(op=='b') sprintf(s,"%d-%d=%d",m1,m2,m1-m2);
if(op=='c') sprintf(s,"%d*%d=%d",m1,m2,m1*m2);
cout<<s<<endl<<strlen(s)<<endl;//输出字符串和其长度
}
return 0;
}
统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式
共2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数−1。
输入 #1
To to be or not to be is a question
输出
2 0
输入 #2
to Did the Ottoman Empire lose its power at that time
输出
-1
说明/提示
数据范围
1≤第一行单词长度≤10。
1≤文章长度≤1,000,000。
#include<iostream>
using namespace std;
//统计单词
#include<algorithm>
// #include<cstdio>
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
for (int i=0;i<s2.size();i++)//转换成小写
if(s2[i]>='A'&&s2[i]<='Z') s2[i]+=32;
for(int i=0;i<s1.size();i++){
if(s1[i]>='A'&&s1[i]<='Z') s1[i]+=32;
}
s1=' '+s1+' ';//查找的话以首尾加空格,否则可能查找到其他单词里的字符相同但不是个单独的单词
s2=' '+s2+' ';//s2前面加个空格 防止之后find查不到第一个
if(s2.find(s1)==-1) cout<<"-1";
else{
int sum=0;int n=0;
while(s2.find(s1,n)!=-1){//find找不到会返回npos也就是-1
sum++;
n=s2.find(s1,n)+1;
}
cout<<sum<<" "<<s2.find(s1)<<endl;
}
return 0;
}
数字反转(升级版)
题目描述
给定一个数,请将该数各个 位 上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个数 s
输出格式
一个数,即 s 的反转数
输入 #1
5087462
输出
2647805
输入 #2
600.084
输出
6.48
输入 #3
700/27
输出
7/72
输入 #4
8670%
输出
768%
说明/提示
所有数据:25% s是整数,不大于20位
25%s是小数,整数部分和小数部分均不大于10位
25%s是分数,分子和分母均不大于10位
25%s是百分数,分子不大于19位
(20个数据)
数据保证:
-
对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。
-
对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 0(小数部分除了 0 没有别的数,那么只保留 1 个 0。若反转之后末尾数字出现 0,请省略多余的 0)
-
对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为0。与整数翻转相关规定见上。
-
对于百分数翻转而言,见与整数翻转相关内容。
数据不存在负数。
#include<iostream>
using namespace std;
//数字反转(升级)
int main()
{
string s;
char p=0;//存放符号
int cnt=0;//指针
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9') cnt++;//记录第一个数
else{//遇到符号,记录,跳出
p=s[i];
break;
}
}
int x=cnt;//记下符号位的位置,小数和分数时有用
cnt--;
while(s[cnt]=='0'&&cnt>0) cnt--;//去除前导零
for(int i=cnt;i>=0;i--)//输出第一个数
cout<<s[i];
if(p==0) return 0;//无符号直接返回
else{
if(p=='%'){
cout<<p;
return 0;
}else cout<<p;//其他继续
}
int m=s.size()-1;
while(s[x+1]=='0'&&x<m-1) x++;//去除末尾的0
while(s[m]=='0'&&m>x+1) m--;//去除多余前导0
for(int i=m;i>x;i--)//输出符号另一边的数
cout<<s[i];
return 0;
}
斯诺登的密码
题目描述
2013 年 X 月 X 日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。
丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.
(以 .
结束输出,只有 6 个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个 C++ 程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩5分钟,你必须在这 5 分钟内编写(杜撰)一个程序,免受上司的 10000000000%10 大板。破译密码的步骤如下:
(1)找出句子中所有用英文表示的数字(≤20),列举在下:
正规: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
。为避免造成歧义,another
算作 1 处理。
(2)将这些数字平方后对 100 取模,如 00,05,11,19,86,99。
(3)把这些两位数按数位排成一行,组成一个新数,如果开头为 0,就去 0。
(4)找出所有排列方法中最小的一个数,即为密码。
输入格式
一个含有 6 个单词的句子。
输出格式
一个整型变量(密码)。如果没有符合要求的数字出现,则输出 0。
输入 #1
Black Obama is two five zero .
输出
425
#include<iostream>
using namespace std;
//斯诺登密码
#include<algorithm>
int main()
{
string s[30]={"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[30]={1,4,9,16,25,36,49,64,81,0,21,44,69,
96,25,56,89,24,61,0,1,4,1,1,4,9};
int k=0,a[10];
for(int i=0;i<6;i++){//6个单词
string word;
cin>>word;//cin到空格自动结束
for(int i=0;i<26;i++){//26中数字
if(s[i]==word){
a[k++]=num[i];//k记录几个合法数字
break;
}
}
}
if(k==0) cout<<0<<endl;
else{
sort(a,a+k);//将数字排序
for(int i=0;i<k;i++){
if(i!=0&&a[i]<10) cout<<0;//如果不是第一个数且是1位数则补一位0
cout<<a[i];
}
cout<<endl;
}
return 0;
}
垂直柱状图
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过100个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入 #1
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HISTOGRAM PROGRAM. HELLO!
输出
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
说明/提示
每行输出后面不允许出现多余的空格。
#include<iostream>
using namespace std;
//垂直柱状图
#include<cstring>
int main()
{
string s[4];
int ch[26];//存每个字母出现的次数
memset(ch,0,sizeof(ch));
for(int i=0;i<4;i++){
getline(cin,s[i]);
for(int j=0;j<s[i].size();j++){
if(s[i][j]>='A'&&s[i][j]<='Z'){
ch[s[i][j]-'A']++;
}
}
}
int maxn=ch[0];//不能用sort,这样会改变字母的顺序
for(int i=1;i<26;i++) maxn=max(maxn,ch[i]);
for(int i=maxn;i>0;i--){
for(int j=0;j<26;j++){
if(ch[j]>=i) cout<<"* ";
else cout<<" ";
}
cout<<endl;
}
cout<<"A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
return 0;
}