1. 题意:输入一个百分制的成绩t,当t在90~100分之间输出A;在80~89分之间输出B;在70~79分之间输出C;在60~69分之间输出D;在0~59分之间输出E;若不在0~100分之间则输出:“Score is error!”。
细节:题目要求输入多组数据,需要用到while(scanf(“%d”,&n)!=EOF){}语句,输出时注意”Score”开头字母大写,最后换行输出。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int t;
while(cin>>t)
{
if(t>=0&&t<60)
cout<<"E"<<endl;
if(t>=60&&t<70)
cout<<"D"<<endl;
if(t>=70&&t<80)
cout<<"C"<<endl;
if(t>=80&&t<90)
cout<<"B"<<endl;
if(t>=90&&t<=100)
cout<<"A"<<endl;
if(t>100||t<0)
cout<<"Score is error!"<<endl;
}
return 0;
}
2.水仙花数:是指一个三位数,他的各个数字的立方和等于他本身,例153=1^3+5^3+3^3.
题意:输出所有在给定范围(m,n)内的水仙花数且从小到大排序,若在此范围内不存在水仙花数,则输出“no”
解题思路:在给定的范围内分别用a,b,c代表该三位数的百位,十位和个位,然后看该三位数是否符合水仙花数,若符合则给所有水仙花数排序,若不符合则输出no。
细节:排序时记得若有x个水仙花数则输出x-1个空格,即:if(j<x-1) cout<<" "。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int m,n;
while(cin>>m>>n)
{
int x=0;
int s[1000];
for(int i=m;i<=n;i++)
{
int a,b,c;
a=i/100;
b=i/10%10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
{
s[x]=i;
x++;
}
}
if(x==0) cout<<"no"<<endl;
else
{
for(int j=0;j<x;j++)
{
cout<<s[j];
if(j<x-1) cout<<" ";
}
cout<<endl;
}
}
return 0;
}
3. 题意:表达式为n^2+n+41,其中 n在(x,y)范围内取整数值,判断该表达式的值是否都为素数,若是,则输出"OK",否则,输出“Sorry”。
解题思路:运用flag作为判断的变量,当做标志,当表达式的值为素数时,flag=0,若不是素数,flag=1。判断是否为素数时,用表达式的值对比他小的且大于二的所有数求余,若余数为零,则说明不是素数,这是运用break使其跳到下一个循环中,若是素数,flag=0.
细节:当x=0,y=0时,表示输出结束,即if(x==0&&y==0) break;
源代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int x,y,i,n,a[100],j;
while(cin>>x>>y)
{
if(x==0&&y==0)
break;
int flag=0;
for(i=0,n=x;n<=y;i++,n++)
{
a[i]=n*n+n+41;
}
for(i=0;i<y-x;i++)
{
for(j=2;j<=a[i];j++)
{
if(a[i]%j==0)
break;
}
if(a[i]>j||a[i]==1)
{
flag=1;
break;
}
}
if(flag==0)
cout<<"OK"<<endl;
else
cout<<"Sorry"<<endl;
}
return 0;
}
4.题意:多项式1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...,求该多项式的和。
解题思路:分组求和,把分母分为奇数和偶数,奇数时为正,偶数时为负,且分数不是整数,要定义为double型。
细节:最后输出时保留两位小数: printf("%.21f\n",s);
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
int m,a[1000],j,i;
cin>>m;
for(i=1;i<=m;i++)
{
cin>>a[i];
}
for(i=1;i<=m;i++)
{
double s=0;
for(j=1;j<=a[i];j++)
{
if(j%2==1) s=s+(double)1/j;
if(j%2==0) s=s-(double)1/j;
}
printf("%.21f\n",s);
}
return 0;
5.题意:输入n个整数,其中有正有负,按照绝对值从大到小排序后输出。
解题思路:运用冒泡排序法:
int t,a[n+1]; //定义数组
for (int i=1; i<=n; ++i) cin>>a[i]; //输入n个数
for (int j=0; j<=n; j++) //冒泡法排序
for (int i=0; i<=n-1-j; i++) //两两相比较
if (a[i]<a[i+1]) //比较与交换
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
细节:当n=0的时候,输出结束。绝对值的处理:fabs().
输出时要换行输出。
源代码:
#include<cstdio>
#include<iomanip>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,i,j,t,a[110];
while(cin>>n)
{
if(n==0)
break;
for(i=0;i<n;i++)
cin>>a[i];
for(j=0;j<n;j++)
{
for(i=0;i<n-1-j;i++)
{
if(fabs(a[i])<fabs(a[i+1]))
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}
for(i=0;i<n-1;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n-1]<<endl;
}
return 0;
}
6.题意:把一个数x插入到从小到大排列好的n个整数中,使新的数列仍然有序。
解题思路:把m插入到数列中,若m小于他前面的数,则把m和他前面的数交换,即
if(a[i]>m)
{
l=a[i]; //把a[i]赋值给l;
a[i]=m; //把m赋值给a[i];
m=l; //把l赋值给m;
}
这样m和他前面的数a[i]就换过来了。
细节:最后要换行输出;输入时输入多组数据。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int a[100];
int main()
{
int n,m,i,l;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
a[n+1]=m;
for(i=1;i<=n;i++)
{
if(a[i]>a[n+1])
{
l=a[i];
a[i]=a[n+1];
a[n+1]=l;
}
}
for(i=1;i<=n+1;i++)
{
printf("%d",a[i]);
if(i<n+1)
printf(" ");
}
cout<<endl;
}
return 0;
}
7.题意:人民币共有100元,50元,10元,5元,2元,1元六种,,若知道每位老师的工资额(正整数),求最少需要多少张人民币才能在给每位老师发工资的时候不用找零。
解题思路:设每位老师的工资为a[i],用a[i]分别除以100、50、10、5、2、1得到x,即所用的人民币的数目,再用a[i]对100、50、10、5、2、1求余,得出来的值赋值给a[i],若a[i]小于100或50、10、5、2、1,求出的余数是他本身,直到a[i]等于或小于100或50、10、5、2、1。一次循环中所有的x的值累加后所得数为最少需要的人民币数。
细节:当n等于0时,输入结束,不作处理,最后换行输出。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int a[100],x=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
x+=a[i]/100;
a[i]%=100;
x+=a[i]/50;
a[i]%=50;
x+=a[i]/10;
a[i]%=10;
x+=a[i]/5;
a[i]%=5;
x+=a[i]/2;
a[i]%=2;
x+=a[i];
}
cout<<x<<endl;
}
return 0;
}
8.回文串:正读反读都一样的字符串,例如level等
题意:输入一个字符串,判断其是否为回文串。
解题思路:首先每次循环必须初始化,令c=0,strlen(a)表示字符串的长度,然后把字符数组a的内容倒序赋值给b,然后计算a,b中相等的个数,如果所有元素都相等则说明a中元素倒序排列后仍相等。
细节:定义字符串的头文件为#include<cstring>,最后要换行输出。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int l,c,i;
char a[1000],b[1000];
while(n--)
{
c=0;
scanf("%s",&a);
l=strlen(a);
for(i=0;i<l;i++)
{
b[i]=a[l-1-i];
}
for(i=0;i<l;i++)
{
if(b[i]==a[i])
c++;
}
if(c==l)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
return 0;
}
9.题意:A和B是两个时间, 都由3个整数组成,分别表示时分秒,例A为34 45 56,就表示A为34小时 45分钟 56秒,输入6个整数分别表示时间A和B所对应的时分秒,输出A+B(分和秒的取值范围在0~59)。
解题思路:首先输入六个整数,把A和B分别代表的时 分 秒对应想加,用a,b,c表示,若a,b,c大于60,例,c大于60,用c对60求余,余数就是A+B所对应的秒,再用c/60再加上b,若b也大于60,处理方式同上。
细节:最后换行输出,且注意最后输出的两个数之间用空格分开。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int N,s,m,h,a,b,c,AH,AM,AS,BH,BM,BS;
cin>>N;
while(N--)
{
cin>>AH>>AM>>AS>>BH>>BM>>BS;
a=AH+BH;
b=AM+BM;
c=AS+BS;
s=c%60;
m=(b+c/60)%60;
h=(((c/60)+b)/60+a);
printf("%d %d %d\n",h,m,s);
}
return 0;
}
10.A^B的含义是“A的B次方”
题意:输出A^B的最后三位表示的整数。
解题思路:首先循环初始化,令c=1,若想表示a^b,则让循环中的数在(1,b)范围内,再令c*=a,即可表示b个a相乘。如果最后c大于1000,令c对1000求余,即可得a^b的最后三位整数。
细节:注意当a=0,b=0时,输入结束,不做处理。,输入多组数据需要用到while(scanf(“%d”,&n)!=EOF){}语句
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int a,b,i;
while(cin>>a>>b)
{
if(a==0&&b==0)
break;
int c=1;
for(i=1;i<=b;i++)
{
c=c*a;
if(c>1000)
c=c%1000;
}
cout<<c<<endl;
}
return 0;
}
11.题意:有一楼梯共M级,刚开始时在第一级,若每次只能跨上一级或二级,要走上第M级,求共有多少种走法。
解题思路:由于一开始就站在第一级上,故上第一级需要0步,上第二级需要一种走法,上第三级需要两种走法,当级数大于等于四级的时候可找到规律:a[i]=a[i-1]+a[i-2]。
细节:输出换行,级数要小于M。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int M,N,i,a[41];
cin>>N;
while(N--)
{
cin>>M;
a[1]=0;
a[2]=1;
a[3]=2;
for(i=4;i<=M;i++)
{
a[i]=a[i-1]+a[i-2];
}
printf("%d\n",a[M]);
}
return 0;
}
12.题意:220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。 而284的所有真约数为1、2、4、71、 142,加起来恰好为220。则称220和284为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。判断给定的两个数A和B是否是亲和数,如果A和B是亲和数的话输出YES,否则输出NO。
解题思路:用A对大于2小于A的所有整数求余,若余数为零,则该数是A的真约数,同理,求出B的所有真约数,若A的所有真约数之和等于B且B的所有真约数之和等于A,则A和B是亲和数。
细节:换行输出
源代码:
#include<stdio.h>
int main()
{
int n,a,b,i,j,w,s;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
w=0,s=0;
for(i=2;i<=a;i++)
if(a%i==0)
w=w+a/i;
for(j=2;j<=b;j++)
if(b%j==0)
s=s+b/j;
if(s==a&&w==b)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
13.题意:手机号是一个11位长的数字串,而短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。输入11位手机号,求其短号。
解题思路:把11为手机号看做为一个整数,故可用该数对100000求余,得出余数,即后五位数,再加上600000,可得短号。
细节:输入11位手机号时,用longlongint定义,最后换行输出。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int N;
long long a;
cin>>N;
while(N--)
{
scanf("%lld",&a);
printf("%lld\n",a%100000+600000);
}
return 0;
}
14.题意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
若给出A0, An+1, 和 C1, C2, .....Cn.求A1 = ?
解题思路:由题意可知:
因为:Ai=(Ai-1+Ai+1)/2 - Ci,
A1=(A0 +A2 )/2 - C1;
A2=(A1 + A3)/2 - C2 , ...
=> A1+A2 = (A0+A2+A1+A3)/2 - (C1+C2)
=> A1+A2 = A0+A3 - 2(C1+C2)
同理可得:
A1+A1 = A0+A2 - 2(C1)
A1+A2 = A0+A3 - 2(C1+C2)
A1+A3 = A0+A4 - 2(C1+C2+C3)
A1+A4 = A0+A5 - 2(C1+C2+C3+C4)
...
A1+An = A0+An+1 - 2(C1+C2+...+Cn)
左右求和得:
(n+1)A1+(A2+A3+...+An) = nA0 +(A2+A3+...+An) + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)
=> (n+1)A1 = nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)
=> A1 = [nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)]/(n+1)
细节:a0,an1,ci,sum都是双精度浮点数,注意用double定义,最后输出时保留两位小数。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int n,i;
double a0,an1,ci,sum;
while(cin>>n)
{
scanf("%lf%lf",&a0,&an1);
sum=0;
for(i=0;i<n;i++)
{
scanf("%lf",&ci);
sum+=(n-i)*ci;
}
printf("%.2lf\n",(n*a0+an1-2*sum)/(n+1));
}
return 0;
}
15.题意:输入菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),输出菜价。
解题思路:输入字符串,即菜种,输出菜价等于数量乘以单价。
细节:输出保留一位小数,换行输出。
源代码:
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
using namespace std;
int main()
{
char c[100];
double y,x,m=0;
while(scanf("%s %lf %lf",&c[100],&y,&x)!=EOF)
{
m+=y*x;
}
printf("%.1lf\n",m);
return 0;
}
总结:通过做这道题,我学到了很多东西,例如输入多组数据时,要用到while(scanf(“%d”,&n)!=EOF){}语句,还用到了许多排序方法,例如冒泡排序:
int t,a[n+1]; //定义数组
for (int i=1; i<=n; ++i) cin>>a[i]; //输入n个数
for (int j=0; j<=n; j++) //冒泡法排序
for (int i=0; i<=n-1-j; i++) //两两相比较
if (a[i]<a[i+1]) //比较与交换
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
刚开始上课的时候听得懵懵懂懂,然后回去的时候看了好长时间的解析才弄懂一些最简单的问题,好在在费了好多时间后终于弄懂了技巧。最开始不管从做题的速度还是熟练程度上都是非常缺乏的,不过后来经过不断的做题,觉得有很大的提升。