- 输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input
输入数据有多组,每组占一行,由一个整数组成。
Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
题意:把在给定范围内的数字转化为给定的字母输出,不在给定范围内的输出”Score is error”.
解题思路:此题非常简单,是顺序结构比较简单的一类,按题目要求写代码即可。
细节处理:没有什么细节需要特别处理。
原代码:
#include
using namespace std;
int main()
{
int t;
while(cin>>t)
{
if(t<0||t>100)
cout<<"Score is error!"<<endl;
else if(t>=90&&t<=100)
cout<<"A"<<endl;
else if(t>=80&&t<=89)
cout<<"B"<<endl;
else if(t>=70&&t<=79)
cout<<"C"<<endl;
else if(t>60&&t<=69)
cout<<"D"<<endl;
else if(t>=0&&t<=59)
cout<<"E"<<endl;
}
return 0;
}
总结:此题目就是运用最开始所学的顺序结构加上多组数据输入的while循环即可。
- 给你n个整数,求他们中所有奇数的乘积。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。
Output
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。
题意:把给定的一组数中所有奇数相乘,把所得到的数输出即可。
解题思路:把所有的奇数找出来,用一个循环把所得到的奇数连乘,就得到了最后的结果。
细节处理:while,for后面别忘了加花括号,最后别忘了换行cout<<endl;
#include
using namespace std;
int main()
{
int n,i,a,temp;
while(scanf("%d",&n)==1)
{
a = 1;
for(i=0;i<n;i++)
{
scanf("%d",&temp);
if(temp%2) a*=temp;
}
printf("%d\n",a);
}
return 0;
}
总结:做这种需要先判断奇和偶,然后再用循环把他们找出来即可,被忘了是多组数据输入。
3.
Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
解题思路:每隔题目所给定的长度,将这些数求平均值,有一个公式,首项加所求平均值的个数减去一就是这m个数的平均数。
细节处理:如果最后的数不足m,还需要单独拿出来计算。但公式和上面的一样。
原代码:
#include <stdio.h>
int main()
{
int n,m,a,b,c;
while (scanf("%d %d", &n, &m) != EOF)
{
b = n/m;
c = n%m;
a = 2;
for (int i = 0; i < b; i++)
{
if (i != 0)
printf(" ");
printf("%d", a + m - 1);
a = a + 2 * m;
}
if (c != 0)
printf(" %d", a + c - 1);
printf("\n");
}
return 0;
}
总结:像这样的题需要找到它的规律,以便于根据规律来写出计算他的式子,以此来快速解决问题。
- Problem Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
解题思路:根据题目给出的数据,我们可以看出选手的得分是从大到小排好序的,因此不用我们从新排序,写码时去掉第一个数据和最后一个数据,求中间n-2个数据的平均值即可。
细节处理:别忘了最后输出的是保留两位小数,所以要用浮点数。别忘了头文件!
原代码:
#include
#include
using namespace std;
int main()
{
int n,i,x=0,max,min,a;
float s;
while(cin>>n)
{
max=0;
min=100;
x=0;
for(i=1;i<=n;i++)
{
cin>>a;
x+=a;
if(max<a)
{
max=a;
}
if(min>a)
{
min=a;
}
}
s=(x-max-min)*1.00/(n-2);
cout<<fixed<<setprecision(2)<<s<<endl;
}
return 0;
}
总结:做这个题需要把最大值最小值去掉,然后求平均值,不能忘了题目要求的浮点数,按自己的理解去写就可以了。
- Font Size: ← →
Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
解题思路:因为小牛四年以后才会生,所以分类讨论,当n<=4的时候,只有第一只母牛会生,所以年数就是母牛数,n>4的时候小牛就开始生了,先把年数减去4,所以就找规律得到代码中的式子。
细节处理:记住分两种情况!
原代码:
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==0)break;
int a,b,c,d;
if(n<=4)cout<<n<<endl;
else{
n=n-4;
a=b=c=d=1;
for(int i=0;i<n;i++)
{
d=c+d;
c=b;
b=a;
a=d;
}
cout<<a+b+c+d<<endl;
}
}
}
总结:像这一类的题也需要先找到规律,然后根据规律来写出式子求出来即可。
Problem Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
解题思路:因为是把绝对值作比较后绝对值从小到大的顺序排列,所以用abs函数来求,然后比较绝对值得大小,再用sort函数排序后输出。
细节处理:别忘了每个数之间的空格!
原代码:
#include
#include
#include
using namespace std;
int com(int a,int b)
{
return abs(a)>abs(b);
}
int main()
{
int a[101],x,i;
while(cin>>i&&i!=0)
{
for(x=0;x<i;x++)
{
cin>>a[x];
}
sort(a,a+i,com);
for(x=0;x<i;x++)
{
cout<<a[x];
if(x!=i-1)
cout<<" ";
}
cout<<endl;
}
return 0;
}
总结:学会运用c++中比较好用的函数如sqrt求根符号,abs绝对值符号等等。
- Problem Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。
解题思路:把所有的数输进去之后,用sort函数排序,再输出即可。
细节处理:sort(a,a+n+2)
原代码:
#include
#include
using namespace std;
int a[110];
int main()
{
int n,m;
while(cin>>n>>m,!(n==0&&m==0))
{
for(int i=1;i<=n;i++)
cin>>a[i];
a[n+1]=m;
sort(a,a+n+2);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<a[n+1]<<endl;
}
return 0;
}
总结:插入这种题,可以把所有数据都输进去后再排序。
Problem Description
作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
Input
输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。
Output
对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
解题思路:把每一个数都从100-1来整除,然后求余,依次往下循环!
细节处理:按照正常的思路把他给写下来就行。
原代码:
#include
using namespace std;
int main()
{
int n,a,sum=0,i;
while(cin>>n)
{
if(n==0)
break;
for(i=1;i<=n;i++)
{
cin>>a;
sum+=a/100;
a%=100;
sum+=a/50;
a%=50;
sum+=a/10;
a%=10;
sum+=a/5;
a%=5;
sum+=a/2;
a%=2;
sum+=a;
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
总结:因为是整数,所以每一个面值都要求一遍。
Problem Description
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
Input
输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。
Output
如果一个字符串是回文串,则输出"yes",否则输出"no".
解题思路:用字符串把它给表示出来,用gets输入,回文串就是收尾字母相同,把他的长度len给表示出来,然后输入开头和末尾的字母,看看是否相等,如果不相等就结束no,相等就继续,知道循环结束,说明是回文串,输出yes。
细节处理:分情况判断是否是回文序列,后别忘了往中间缩。
原代码:
#include<stdio.h>
#include<string.h>
int main(){
int n,i,len,j;
char s[100];
scanf("%d",&n);
getchar();
while(n--){
gets(s);
len=strlen(s);
i=0;j=len-1;
while(i<j){
if(s[i]!=s[j])
break;
i++;
j--;
}
if(i>=j)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
总结:像这种输字符串的需要用长度strlen(s)来处理,这样就十分方便简要,代码也会很简单。
Problem Description
这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
Input
输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。题目保证所有的数据合法。
Output
对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0~59),每个输出占一行,并且所有的部分都可以用32位整数表示。
解题思路:因为是60进制的,所以应该先从秒判断,来确定最后时的数,然后输出时再把时分秒给取余,就得到了最后的结果。
细节处理:最后输出的时候,别忘了求余即可。
原代码:
#include
using namespace std;
int main()
{
int N,AH,AM,AS,BH,BM,BS;
cin>>N;
while(N--)
{
cin>>AH>>AM>>AS>>BH>>BM>>BS;
BS+=AS;
BM+=(AM+BS/60);
BH+=(AH+BM/60);
cout<<BH<<" "<<(BM%60)<<" "<<(BS%60)<<endl;
}
return 0;
}
总结:这种题类似进制问题,只要把他们加起来求余就可以完成,这样的题就可以这样处理。
Input
每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开.
如果n=0并且m=0表示输入的结束,不做处理。
Output
针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”,否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格.
解题思路:把B中与A对应的元素找出来,然后把A中剩下的元素按从大到小的顺序排出来,输出,如果A中的元素每一个都能在B中找到,就输出NULL。
细节处理:像这种分支比较多的程序,我们需要理清思路一步一步的写,千万不要把关系处理乱了,层次分明,条理清晰。
原代码:
#include
#include
#include
using namespace std;
int main()
{
int a[100], b[100], judge[100];
int i, j, k;
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
int flag[100] = { 0 }, num = 0;
if (m == n&&m == 0)
{
return 0;
}
else
{
for (i = 0; i < n; i++)
{
cin >> a[i];
}
for (i = 0; i < m; i++)
{
cin >> b[i];
}
for (j = 0; j < n; j++)
{
for (k = 0; k < m; k++)
{
if (a[j] == b[k])
{
flag[j] = 1;
}
}
}
for (i = 0; i < n; i++)
{
if (flag[i] != 1)
{
sort(a, a + n);
cout << a[i] << " ";
judge[num++] = a[i];
}
}
if (num == 0)
{
cout << "NULL";
}
cout << endl;
}
}
}
总结:这样的程序应定要认真仔细的一步一步写,如果中间错一点就全错了,所以要明确步骤,一步一步的写。
Font Size: ← →
Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
解题思路:对于这种超级简单的题就没有啥特别的思路,就是按套路写,把给定的两个数乘出来然后出去1000求余,输出余数即可;
细节处理:没啥细节。
原代码:
#include
using namespace std;
int main()
{
int a,b,x,i;
while(cin>>a>>b,a!=0||b!=0)
{
x=1;
for(i=1;i<=b;i++)
x=(a*x)%1000;
cout<<x<<endl;
}
return 0;
}
总结:一个非常常规的循环语句,按套路写就可以。
Problem Description
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵-
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
解题思路:找到猴子吃桃的规律,然后倒着用循环语句把规律用式子表示出来即可,反正我是用手推出来的!
细节处理:每输入一组数据之后,别忘了把y变成1,否则就会一直加下去,这样的话第二组数据数出来的结果就是错的.
原代码:
#include
using namespace std;
int main()
{
int y=1,i,n,s=0;
while(cin>>n)
{
for(i=1;i<n;i++)
{
s=(y+1)*2;
y=s;
}
cout<<s;
cout<<endl;
s=0;
y=1;
}
return 0;
}
总结:像这种题目需要先把它的规律找出来,然后寻找式子把他给表示出来,然后用一个循环就可以完成了,有一些麻烦的会多组循环,但也不影响。
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
解题思路:先把前走向前三级的数据给表示出来,然后从第四个台阶开始,每一级台阶的走法,就是前两个台阶走法的加和,用循环把它给表示出来,然后输出题目所给的结果即可。
细节处理:记得每输入一组数据就要换行。
原代码:
#include
using namespace std;
int main()
{
int N,i,n;
int a[1000];
cin>>N;
while(N--)
{
cin>>n;
a[1]=0;
a[2]=1;
a[3]=2;
for(i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
cout<<a[n];
cout<<endl;
}
return 0;
}
总结:想此类题目,需要仔细审题然后把其中的规律找出来,找到一个固定的式子,然后用循环把他给表示出来即可。
- Problem Description
一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?
Input
输入数据有若干组,每组数据包含二个整数a,b(0<a<10000, 10<b<100),若遇到0 0则处理结束。
Output
对应每组数据,将满足条件的所有尾数在一行内输出,格式见样本输出。同组数据的输出,其每个尾数之间空一格,行末没有空格。
解题思路:这个题目就比较有意思了,我比较喜欢,根据题意来说这样的两位数有可能不止一组,所以我们就从0开始到99,一个一个数来试,如果在10以内出现的两位数,就得先输出一个零,再输出个位数,如果出现两个以上的两位数,就要输入空格,这就需要用if语句来判断,最后输出所有能被整除的结果。
细节处理:每一组数据完成以后需要把k变回零,否则就会影响下一组的结果。
原代码:
#include
using namespace std;
int main()
{
int a,b,s,i,j,k=0;
while(cin>>a>>b)
{
if(a==0&&b==0)
break;
s=0;
for(i=0;i<=99;i++)
{
j=a*100+i;
if(j%b==0)
{
if(k!=0)
{
cout<<" ";
}
if(i<10)
{
cout<<"0";
cout<<i;
}
else
{
cout<<i;
}
k++;
}
}
cout<<endl;
k=0;
}
return 0;
}
总结:处理这一类问题一定要理清思路不要乱,就算是一个空格没有处理好,在这个程序也是错的,所以,做这种题的时候一定要仔细,层次清晰调理。