(第一题)题意:关于输入分数,输出A,B,C,D,E等级;
分析:首先使用while 语句,多次输入n,if语句单独列出情况分等级。
源码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int t;
while(cin>>t)
{
if(t>=90&&t<=100) printf("A\n");
if(t>=80&&t<=89) printf("B\n");
if(t>=70&&t<=79) printf("C\n");
if(t>=60&&t<=69) printf("D\n");
if(t>=0&&t<=59) printf("E\n");
if(t>100||t<0) printf("Score is error!\n");
}
return 0;
}
总结:对数据细节的处理,要考虑全面,输入多组数据的处理,划分好分数对应的等级,尤其是注意不在0~100范围内的分数的处理,每次输出都要换行。
(第二题)题意:关于给定区间求该区间的水仙花数并输出。
分析:使用while循环语句,对该区间所有数进行拆分,判断是否为水仙花数,记录个数并输出水仙花数。
#include <iostream>
using namespace std;
int main()
{
int m,n;
while (cin>>m>>n)
{
int x=0;
int p[1000];
for(int i=m; i<=n; i++)
{
int a=0,b=0,c=0;
a=i/100;
b=i/10%10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
{
p[x]=i;
x++;
}
}
if(!x) cout<<"no"<<endl;
else
{
for(int j=0;j<x;j++)
{
cout<<p[j];
if(j<x-1) cout<<" ";
}
cout<<endl;
}
}
return 0;
}
总结:多个水仙花数之间用空格隔开,但最后一个数后面没空格, 所以注意最后对输出的处理。
(第三题)题意:n个数,求他们中所有奇数的乘积。
分析:利用if语句判断奇数,是奇数即可相乘,并输出最后乘积。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,i;
int a;
while(cin>>n)
{
int s=1;
for(i=0;i<n;i++)
{
cin>>a;
if(a%2!=0)
s=s*a;
}
cout<<s<<endl;
}
return 0;
}
总结:这是一道简单的if判断句,注意的是,s附初始值为1千万别附成0。
(第四题)第四题 规定区间所有数对于x*x+x+41该表达式是否都为素数
分析 :首先利用!=EOF输入多组数据,其中x,y都等于0时结束程序用flag作为一个指示,将不符合的列出来定义为flag1,则最终由flag是0或1判断输出OK,sorry。
#include <iostream>
#include <cmath>
using namespace std;
int a[100];
int main()
{
int n,i,j,x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
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(j<a[i]||a[i]==1)
{
flag=1;
break;
}
}
if(flag==1)
cout<<"Sorry"<<endl;
else
cout<<"OK"<<endl;
}
return 0;
}
总结:如果j<a[i]或者a[i]为1则说明不是素数所以输出sorry,应注意输出的大小写
(第五题)题意:输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和,1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
分析:正负相间求和并发现与奇偶数相关,因此产生了分奇偶数讨论的想法,若是奇数前面的符号为正号,若为偶数前面加和的符号为负号
源代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int m,n,j;
float s=0;
int a[100];
cin>>m;
for(n=1;n<=m;n++)
{
cin>>a[n];
}
for(n=1;n<=m;n++)
{
s=0;
for(j=1;j<=a[n];j++)
{
if(j%2==0)
s=s-(float)1/j;
if(j%2!=0)
s=s+(float)1/j;
}
printf("%.2f\n",s);
}
return 0;
}
总结:注意的是,对于分数的处理,(float)分数,并注意保留两位小数。
(第六题)题意:青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
分析:输入a[i]并用sort函数进行排序,最后输出除了最高分和最低分之外其他分数,并通过sum求和。
源代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,i;
double sum=0,a[110],s=0;
while(cin>>n)
{
sum=0;
for(i=0;i<n;i++)
{
scanf("%lf",&a[i]);
}
sort(a,a+n);
for(i=1;i<n-1;i++)
{
sum+=a[i];
}
s=sum/(n-2);
printf("%.2lf\n",s);
}
return 0;
}
总结:注意的是求和是除了最大值和最小值之外其他数的和,所以求平均就应该除以n-2 ,采用while函数方便输入多组数据。
(第七题)题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
分析:该题运用递归方法,第一年一只,第二年两只,第三年三只,到了第四年便发现有规律可循,今年的数量等于去年家加大前年羊的数量,输出最终数量。
源代码:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
int n,i,f[50];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
f[1]=1;f[2]=2;f[3]=3;
for(i=4;i<=n;i++)
{
f[i]=f[i-3]+f[i-1];
}
printf("%d\n",f[n]);
}
return 0;
}
总结:对于变化的数要从中找出规律使之不再成为只能数不能算的题,就如生羊数羊的问题,就是很好的例子。
(第八题)题意:输入n(n<=100)个整数,按照绝对值从大到小排序后输出。
分析:输入n个数,用if语句判断绝对值大小,并把绝对值大的往前排,输出。
源代码:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
int n,i ,a[110],j,t;
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;
}
总结:本题应注意的是,最后的输出,若是直接输出a[i],其中i小于等于n-1则最终输出的结果最后一个数据后面就会有一个空格,程序是无法通过,所以再做类似的题时,应当注意,最后一个数据拿出来单独输出。
(第九题)题意:“回文串”是一个正读和反读都一样的字符串,输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。判断是否为回文串。
分析:先输入并计算原字符串的长度,输入到数组a中去,然后把数组a的内容倒叙赋值给b数组,然后计算a,b中相等元素的个数,如果所有元素都相等,则说明a中元素倒序排列后仍相等,则是回文串。
源代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,length,count;
char a[1000],b[1000];
while(n--)
{
count=0;
scanf("%s",&a);
length=strlen(a);
for(i=0;i<length;i++)
b[i]=a[length-1-i];
for(i=0;i<length;i++)
if(b[i]==a[i])
count++;
if(count==length)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}
总结:该题运用count计数,但是注意每次输入新的n的值时,count=0,要是判断一个字符串是否为回文串,首先就想定义一个字符数组,把字符串输入,倒叙输出形成一个新的字符串,在通过判断相应位置对应的字符是否相等,判断是否为回文串。
(第十题)题意:买菜,输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),求买菜一共花了多少钱
分析:买菜,无非是买的各种菜的单价乘以买的斤数相加即可,所以关注的重点就是如何输入菜种,数量,单价,因为菜种是字串所以定义string,然后再利用while输入多组数据即可。
源代码;
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
string str;
double x,y,sum=0;
while(cin>>str>>x>>y)
{
sum+=x*y;
}
printf("%.1lf\n",sum);
return 0;
}
总结:应注意的是,最后题目要求保留一位小数。
(第十一题)题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
分析:已知两点坐标,根据数学公式可以求出它们分别与原点连线,所成夹角的余弦值,即向量点乘积除以模长的乘积,然后利用反三角函数求出相应的角度。
源代码:
#include<iostream>
#include<cmath>
using namespace std;
const double PI=acos(-1.0);
int main()
{
double x1, x2, y1, y2;
double mo, ji;
int t;
scanf("%d", &t);
while (t--)
{
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
mo = sqrt(x1*x1 + y1*y1)*sqrt(x2*x2 + y2*y2);
ji = x1*x2 + y1*y2;
printf("%.2lf\n", acos(ji / mo) / PI*180.0);
}
return 0;
}
总结:最后求出的是多少π所以需要处以π乘以180得到0到180度之间的角度。
(第十二题)题意:sky数,它的十进制,十二进制,十六进制四位数字之和都相同,判断是否为sky数。
分析:首先是进制转换,定义三个副函数实行进制转换,并输出各自的四位数之和,最后写个主函数,判断是否为sky数。
源代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int sixteenth(int n)
{
int sum=0;
while(n)
{
sum+=n%16;
n=n/16;
}
return sum;
}
int twelfth(int n)
{
int sum=0;
while(n)
{
sum+=n%12;n=n/12;
}
return sum;
}
int tenth(int n)
{
int sum=0;
while(n)
{
sum+=n%10;n=n/10;
}
return sum;
}
int main()
{
int num;
while(cin>>num)
{
if(num==0)
break;
int a=tenth(num),b=sixteenth(num),c=twelfth(num);
if(a==b&&b==c)
printf("%d is a Sky Number.\n",num);
else
printf("%d is not a Sky Number.\n",num);
}
return 0;
}
总结:注意最后输出时是一整句话,最后主函数对输入的数进行进制转换时只要把它放进相应地函数中即可完成。
(第十三题)题意:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么。
分析:用不全的整数乘以一百加上你所求的两位数即是一个完整的数,由题目可知,该数能被所给的另一个数所整除,则用for循环语句从最小值开始逐一筛选。
#include<cstdio>
#include<iostream>
int main()
{
int n,m;
int a[100];
while(scanf("%d%d",&n,&m),n+m)
{
int t=n*100;
int l=0;
for(int i=0;i<=99;i++)
if((t+i)%m==0)
{
a[l++]=i;
}
for(int i=0;i<l-1;i++)
printf("%02d ",a[i]);
printf("%02d\n",a[l-1]);
}
return 0;
}
总结:应注意的是最后要保证是两位数而不是一位,则需要%02d以两位整数输出,i的范围要注意。
(第十四题)题意:集合相减
分析:集合相减即被减集合所含的元素除去a在b中也含有的元素所剩的即是集合相减的结果
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int n,m,i,j,sum,k;
int a[200],b[200],c[200];
while(scanf("%d%d",&n,&m)==2,n!=0||m!=0)
{
k=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<m;j++)
scanf("%d",&b[j]);
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<m;j++)
{
if(a[i]==b[j])
sum=1;
}
if(sum==0)
{
c[k]=a[i];
k++;
}
}
if(k==0)
printf("NULL\n");
else
{
sort(c,c+k);
for(int l=0;l<k;l++)
printf("%d ",c[l]);
printf("\n");
}
}
return 0;
}
总结:查找集合A中有的但集合B中没有的元素,若集合为空集输出null不为空集则输出该集合。
(第十五题)题意:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
分析:本题采用递归方法,由第一阶第二阶第三阶的所走方法,总结出四阶及四阶以上走法
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[10000];
int main()
{
int M,N,i;
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;
}
总结:递归方法运用广泛,找出规律,方便计算避免无序的一直数着。
感受:这些题涵盖了几乎这学期学的所有处理问题的方法,系统的进行了复习,有的题甚至采用了一些其他新颖的方法,程序设计就是让你用编程解决身边的问题,感觉收获的很多。