班级:______数学类3班____________学号:_2018212819____
报告人姓名:___崔珊________
实验地点: _______山东农业大学东校区教学楼413________
完成起止日期: __2019年1月1日至2019年1月4日__
一、
题意:输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
解题思路:按题目要求用分支语句,将成绩分类
题目代码:
#include<iostream>
#include <cstdio>
using namespace std;
int main()
{
int score;
while(cin>>score) //多组输入
if (score>=90 && score <= 100) //分支语句分类
printf("A\n"); //按题目要求换行操作
else if (score>=80 && score < 90)
printf("B\n");
else if (score>=70 && score < 80)
printf("C\n");
else if (score>=60 && score < 70)
printf("D\n");
else if (score>=0 && score < 60)
printf("E\n");
else printf("Score is error!\n");
return 0;
}
二、
题意:
每一组数据都包含两个时间,将两个时间相加。
解题思路:
分别定义两个数组,将两个时间对应的时分秒输入数组中保存,然后将两个数组中相对位置的对应元素相加,然后输出相加后的数。
解题细节:
在分跟秒对应的数据相加后要是超过60要往前进一位数。
题目代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n,a[3],b[3],i;
scanf("%d",&n);
while(n--)
{
for(i=0;i<3;++i)
scanf("%d",a+i);
for(i=0;i<3;++i)
scanf("%d",b+i);
for(i=2;i>=0;--i)
{
a[i]+=b[i];
if(i!=0&&a[i]>=60)
{
a[i]-=60;
++a[i-1];
}
}
for(i=0;i<2;++i)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
}
三、
题意:
在每个老师工资额知道的前提下,最少要准备多少张人民币,才能在老师发工资的时候不用找零。
解题思路:
依次输入每个老师的工资,然后用工资除以100,然后用所得的余数除以50,再用余数除以10,再用余数除以5,再用余数除以2,这样最后就可以计算出每个老师的工资需要多少张人民币,然后把每个老师所需的数量相加,就可以得出最后的结果。
解题细节:
一定要从面额大的人民币数算起,不能颠倒。
题目代码:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n),n)
{
int d,ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&d);
ans+=d/100;d%=100;
ans+=d/50;d%=50;
ans+=d/10;d%=10;
ans+=d/5;d%=5;
ans+=d/2;d%=2;
ans+=d;
}
printf("%d\n",ans);
}
return 0;
}
四、
题意:
将一个整数插入到已经排好顺序的序列中,使新的数列仍然有序。
解题思路:
将排好序的序列利用循环语句分成比输入的整数大的一部分跟比整数小的一部分,然后先将小的一部分挨个输出,再输出该整数,然后再把大的一部分挨个输出。
解题细节:
先要判断序列的个数是否在0-100之间或者序列的个数跟输入的整数是否都为零,还要注意输出的时候两个数之间要有空格。
题目代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int main()
{
int x,n,i,j,a[110];
while(cin>>n>>x&&(n||x))
{
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
if(x<a[i])
break;
}
for(j=0;j<i;j++)
{
cout<<a[j]<<" ";
}
cout<<x;
for(j=i;j<n;j++)
{
cout<<" "<<a[j];
}
cout<<endl;
}
return 0;
}
五、
题意:
求多项式1-1/2+1/3-1/4……的和
解题思路:
先用循环语句将从1开始的每个数字取倒数并保存在数组中,然后用条件语句判断是否为偶数,若为偶数,则取相反数,最后加和输出。
结题细节:
注意某些数值需要用浮点数定义而不能用整数。
题目代码:
#include <stdio.h>
int main(){
double sum;
int z, n, i;
scanf("%d", &z);
while ( z-- ){
scanf("%d", &n);
sum = 0;
if ( n&1 ){
sum += 1;
for ( i=2; i<n; i+=2 ){
sum += -1.0/i+1.0/(i+1);
}
}
else {
for ( i=1; i<n; i+=2 ){
sum += 1.0/i-1.0/(i+1);
}
}
printf("%.2lf\n", sum);
}
return 0;
}
六、
题意:
输入数据的第一行是一个N(N <= 200),表示有N个数据,接下来的N行每一行为一个11位的手机号码
解题思路:
定义字符串,先输入N个数据,然后再逐个分析,输入十一位数字,先输出6然后当输入第七个数时再输出,然后每输出一组数据换行。
题目代码:
#include <iostream>
using namespace std;
int main()
{
int N;
char Lu[12];
cin >> N;
while (N--)
{
for (int i = 1; i <= 11; i++)
cin >> Lu[i];
cout << 6;
for (int i = 7; i <= 11; i++)
cout << Lu[i];
cout << endl;
}
return 0;
}
七、
题意:去掉一个最高分和一个最低分,然后计算平均得分,输出选手的得分。
解题思路:先将所有成绩从小到大排序,然后从第二大元素加到倒数第二大的元素,用这个和除以n-2,就是平均值了
题目代码:
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,i,j;
int a[100];
double sum;
while(cin>>n)
{
sum=0.0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(j=1;j<n-1;j++)
{
sum+=a[j];
}
printf("%.2f\n",sum/(n-2));
}
return 0;
}
八、
题意:给一整数和一字符,输出一个等边三角形。
解题思路:循环控制输出,设置变量控制空格。
注意:三角形右侧不含有空格,字符@表示结束。
题目代码:
#include<iostream>
using namespace std;
int main()
{
char a;int n,i,j,flag=0;
while(cin>>a>>n)
{
if(a=='@') break;
if(flag)
cout<<endl;//每个图形中间输出换行//
flag=1;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n+i-1;j++)
{
if(j==n-i+1||j==n-1+i)
cout<<a;
else cout<<" ";
}
cout<<endl;
}//用n+i-1控制j,去掉多余空格//
for(j=1;j<=2*n-1;j++)
cout<<a;
cout<<endl;
}
}
九、
题意:一个4位数其十进制,十二进制,十六进制各位数之和都为相同的数,则其位sky数,判断一个4位数是否是sky数。
解题思路:进制转换并判断。
注意:要满足3个条件,任一不满足都不行,输入0表示结束。
题目代码:
#include<iostream>
using namespace std;
int main()
{
int n,m,r, a,b,c,d, x,y,z;
while(cin>>n)
{
if(n==0) break;
m=n;
x=0;y=0;z=0;
a=n%10;
b=(n%100)/10;
d=n/1000;
c=n/100-d*10;
x=a+b+c+d;//十进制//
while(n)
{
r=n%12;
n=n/12;
y+=r;
}//十二进制//
n=m;
while(n)
{
r=n%16;
n=n/16;
z+=r;
}//十六进制//
if(x==y&&x==z) cout<<m<<" is a Sky Number."<<endl;
else cout<<m<<" is not a Sky Number."<<endl;
}
十、
题意:春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。
现在要求输出所有在m和n范围内的水仙花数。
解题思路:
用EOF控制多组输入,先把这个三位数的各个位的数字赋给三个变量,这三个变量的立方和等于原数本身。用k控制空格的输出。
注意:
注意空格不要多余。
题目代码:
#include<stdio.h>
using namespace std;
int main(){
int m,n,i,a,b,c,k;
while(scanf("%d %d",&m,&n)!=EOF){
k=0;
for(i=m;i<=n;i++){
a=i/100;
b=i/10-a10;
c=i-a100-b10;
if(i==(aaa+bbb+cc*c)){
if(k0){
printf("%d",i);k++;
}
else {
printf(" %d",i);
k++;
}
}
}
if(k0)printf(“no\n”);
else printf("\n");
}
return 0;
}
十一、
题意:对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
解题思路:
判定素数n,设置函数,用n除以2到n的平方根取余是否为0判断是否为素数。Boolen型控制来降低时间复杂度。
注意:
要注意程序的时间复杂度、输出的大小写。
题目代码:
#include<math.h>
using namespace std;
int ss(int n)
{
for(int i=2;i<=sqrt(n);i++){
if(n%i0){
return 0;
}
}
return 1;
}
int main(){
int x,y,n,s;
bool flag;
while(cin>>x>>y){
if(x0&&y==0)break;
if(x>=-39&&x<y&&y<=50){
flag=false;
for(int i=x;i<=y;i++){
n=i*i+i+41;
if(ss(n)==0){
flag=true;
break;
}
}
}
if(flag)cout<<“Sorry”<<endl;
else cout<<“OK”<<endl;
}
return 0;
}
十二、
题意:
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
解题思路:
可以将其看作为一个字符串,应用字符串与字符数组的关系判断正反向是否相同。
*注意:输入字符串可以考虑用gets,并注意gets的头文件#include<string.h>
题目代码:
#include<iostream>
#include<string.h>
using namespace std;
char a[105][105];
int main()
{
int i,n,x,j,t=0;
cin>>n;
for(i=0;i<=n;i++)
{
gets(a[i]);
}
for(i=1;i<=n;i++)
{
x=strlen(a[i]);
t=0;
for(j=0;j<x;j++)
{
if(a[i][j]!=a[i][x-j-1]) t=1;
}
if(t==0) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}
十三、
题意:
A-B求的是两个集合的差,就是做集合的减法运算。(当然,大家都知道集合的定义,就是同一个集合中不会有两个相同的元素,这里还是提醒大家一下)
解题思路:
可以将A B两个集合的元素作为两个数组的元素,应用查找,如果B中有A中的元素可以将A中该元素变为0,后将A中元素不为0的输出。
*注意:此种方法要单独考虑A 中B中是否含有0元素。
*排序可以应用sort函数
//可以将程序优化,先排序后查找,排序后查找可以减少循环。
题目代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[105],b[105],c[105];
int main()
{
int m,n,i,y,t,o,j;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
y=0;
for(i=0;i<n;i++)
{
cin>>a[i];
if(a[i]==0) y=1;
}
for(i=0;i<m;i++)
{
cin>>b[i];
if(y==1&&b[i]==0) y=2;
}
if(y==1) cout<<0<<" ";
t=0;
o=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i]==b[j]) a[i]=0;
}
if(a[i]!=0)
{
c[o]=a[i];
o++;
t=1;
}
}
sort(c,c+o);
for(i=0;i<o;i++)
cout<<c[i]<<" ";
if(y!=1&&t==0) cout<<"NULL";
cout<<endl;
}
}
十四、
题意:
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
解题思路:
应用for循环表示A^B。
*注意每输入一组都要将表示乘积的c=1。
题目代码:
#include<iostream>
using namespace std;
int main()
{
int a,b,i,c;
while(cin>>a>>b)
{
if(a==0&&b==0) break;
c=1;
for(i=0;i<b;i++)
c=(c*a)%1000;
cout<<c<<endl;
}
}
十五、
题意:
大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。
现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?
解题思路:
可以将该十一位数字串看做一个有十一位的数,后六位就可用a[i]除以100000取余表示,而前边加一个6可以将余数+600000或者先输出数字6。
*注意:当为极限值时会用int表示不了,用long long 定义数组。
题目代码:
#include<iostream>
using namespace std;
long long a[202];
int main()
{
int n,i;
while(cin>>n)
{
for(i=0;i<n;i++)
{
cin>>a[i];
cout<<600000+a[i]%100000<<endl;
}
}
}