班级:2018级数学类1班 学号:2018212827
报告人姓名:段振威
实验地点: 教学楼409实验室
完成起止日期: 2018.1.2——2018.1.4
Problem 01(第一套1001)
- 输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E; - 题意
此题为简单的输入输出,只需输入一个百分制成绩,接着通过题目中的限制条件,转换成对应的等级即可。
- 思路
通过循环实现多组输入,通过if和else来判断。
- 细节
注意要t>=90&&t<=100,而不是90=<t<=100。
- 源代码
#include<stdio.h>
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
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(100<t||t<0)
printf("Score is error!\n");
}
return 0;
}
Problem 02(第一套1003)
- 给你n个整数,求他们中所有奇数的乘积。
- 题意
有n个整数,n个数中会有各种各样的数,把里面
- 思路
一个循环多组输入n,一个循环输入整数,循环中加入判断条件来判断是否为奇数。
- 细节
注意换行\n
- 源代码
#include<stdio.h>
int main()
{
int i,n,sum,p;
while(scanf("%d",&n)!=EOF)
{
sum=1;
for(i=0;i<n;i++)
{
scanf("%d",&p);
if(p%2==1)
sum*=p;
}
printf("%d\n",sum);
}
return 0;
}
Problem 03(第一套1004)
- 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
- 题意
输入x和y后,n在x和y之间取值,计算关于n的表达式的值,并判断是否为素数。
- 思路
输入x和y后,通过for循环实现输入区间(x,y)中的n,有了n之后,加上判断条件判断是否为素数。
- 细节
定义一个变量a=0或a=1,a=1代表n全为素数,如果a=1,输出OK;同样a=0代表至少有一个不是素数,输出Sorry。不要忘了如果x和y为0时,berak。
- 源代码
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,x,y,k,s;
while(scanf("%d%d",&x,&y)!=EOF)
{
int a=1;
if(x==0&&y==0)
break;
for(n=x;n<=y;n++)
{
s=n*n+n+41;
k=sqrt(s);
for(i=2;i<=k;i++)
{
if(s%i==0)
{a=0;
break;}
}
}
if(a==0)
printf("Sorry\n");
if(a==1)
printf("OK\n");
}
return 0;
}
Problem 04(第一套1005)
- 多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
现在请你求出该多项式的前n项的和。、 - 题意
每输入一个整数n,输出对应的前n项的和。
- 思路
输入m个n后,,有了n后,写出关于此式的累加,输出和即可。
- 细节
每一次都要初始化和为0,分别输出和。pow(x,y)代表x的y次方。
- 源代码
#include<stdio.h>
#include<math.h>
int main()
{
int i,k,m;
scanf("%d",&m);
int a[m+1];
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
double s=0 ;
for(k=1;k<=a[i];k++)
{
s=s+(1/((pow((-1),(k+1)))*k));
}
printf("%.2lf\n",s);
}
return 0;
}
Problem 05(第一套1007)
- 青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
- 题意
n个数据中,去掉最大值和最小值,然后将剩下的数据求出平均值,即为得分。
- 思路
先将n个数求和,根据题中给出的范围,故意先定义最大值与最小值(见源码),然后与每一个数据比较,得最大值和最小值,和减去最大值与最小值之后除以(n-2)
- 细节
注意根据题目给出的范围来定义最值。
- 源代码
#include<stdio.h>
int main()
{
int max,min,n,i,s,sum;
double ave;
while(scanf("%d",&n)!=EOF)
{
max=-1;min=101;sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&s);
sum=sum+s;
if(max<s) max=s;
if(min>s) min=s;
}
ave=(sum-max-min)*1.0/(n-2);
printf("%0.2f\n",ave);
}
return 0
}
Problem 06(第一套1009)
- 输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
- 题意
对所有的数加绝对值后排序输出。
- 思路
fabs绝对值函数,冒泡排序
- 细节
最后一个数后没有空格,n==0;break;
- 源代码
#include<stdio.h>
#include<math.h>
int main()
{
int n;
int i;
int j;
int t;
int a[201];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(fabs(a[i])<fabs(a[j]))
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}
Problem 07(第一套1010)
- 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
- 题意
先插入后排序
- 思路
输入n个数后,直接将x放最后,再重新排序,再输出。
- 细节
最后一个数后没有空格,分别输出,使用sort排序,注意头文件。n==0时,break.
- 源代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,i,m,a[101];
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
{break;}
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
a[n]=m;
sort(a,a+n+1);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[n]);
}
return 0;
}
Problem 08(第一套1011)
- 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。 - 题意
尽量用最少的张数发放工资,而且要刚刚好。
- 思路
“贪心算法”,分别用工资从100开始除以,得第一个张数,然后对100求余。依次对50,等相同操作,将所有张数加起来即为结果。
- 细节
工资为0时,break;
- 源代码
#include<stdio.h>
int main()
{
int n,i,temp,sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&temp);
sum+=temp/100;
temp%=100;
sum+=temp/50;
temp%=50;
sum+=temp/10;
temp%=10;
sum+=temp/5;
temp%=5;
sum+=temp/2;
temp%=2;
sum+=temp;
}
printf("%d\n",sum);
}
return 0;
}
Problem 09(第一套1012)
- “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
- 题意
写一个程序,判断输入的字符串是否回文。
- 思路
先输入字符串,通过下标操作来判断是否回文
- 细节‘
定义变量表示“真”假“
- 源代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
int n,x;
while(cin>>x)
{
for(int i=0;i<x;i++)
{
bool b=true;
cin>>a;
n=a.size();
for(int i=0;i<n/2;i++)
if(a[i]!=a[n-i-1])
b=false;
if(b)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
return 0;
Problem 10(第一套1014)
- HDOJ上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱。
这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。 - 题意
将输入的两组数相加。
- 思路
输入N个两组数后,有了这两组数,两组秒相加大于60多出对应的分,通过整数整除60实现得到对应的分。而将要输出的秒即为两组秒相加对60求余。两组分相加再加上上面得到的分对60求余即为将要输出的分。而多出的时为两组分相加再加上上面得到的分对60整除。最后将时都加起来为将要输出的时。
- 细节
空格输出,改行。
- 源代码。
#include <stdio.h>
int main()
{
int N,AH,AM,AS,BH,BM,BS;
int h,m,s;
int h_carry,m_carry;
while (scanf("%d",&N)!=EOF)
{
for(int i=0;i<N;i++)
{
scanf("%d%d%d%d%d%d",&AH,&AM,&AS,&BH,&BM,&BS);
s=(AS+BS)%60;
m_carry=(AS+BS)/60;
m=(m_carry+AM+BM)%60;
h_carry=(AM+BM+m_carry)/60;
h=h_carry+AH+BH;
printf("%d %d %d\n",h,m,s);
}
}
return 0;
}
}
Problem 11(第一套1017)
- 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数 - 题意
将这两个数的所有真约数找出来,相加是否为另一个数。
- 思路
直接从循环i从1开始到这个数本身-1,用这个数对i求余,若余数为0,就加在一起。另一个数也是如此,然后判断加起来是否为另一个数。
- 细节
多组输入这两个数
- 源代码
#include<stdio.h>
int main()
{ int A,B,M;
while (scanf("%d",&M)!=EOF)
{
for(int i=0;i<M;i++) { scanf("%d%d",&A,&B);
int sum=0,sun=0;
for (int j=1;j<A;j++)
{ if(A%j==0)
sum+=j;
}
for (int k=1;k<B;k++)
{
if(B%k==0)
sun+=k; }
if(sum==B&&sun==A)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
Problem 12(第一套1018)
- 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
- 题意
从第一级到第M级有多少选择。
- 思路
典型的斐波那契数列问题,从第一级到第二级有1种走法,从第一级到第三级有2种走法,从第一级到第M级有f(M)=f(M-1)+f(M-2)种走法。
- 源代码、
#include<stdio.h>
int main()
{
int i,N,M,a[50];
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&M);
a[2]=1;
a[3]=2;
for(int j=4;j<=M;j++)
{a[j]=a[j-1]+a[j-2];}
printf("%d\n",a[M]);}
return 0;
}
Problem 13(第一套1024)
- 妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。
- 题意
分别将各类菜品,单价与数量相乘然后相加。
- 思路
多次输入一个字符串和两个实数,将两个实数相乘相加。
- 细节
注意保留一位小数。
- 源代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
double x,y,sum=0;
while (cin>>a>>x>>y)
{
sum+=x*y;
}
printf("%.1lf\n",sum);
return 0;
}
Problem 14(第二套1005)
- 把一个偶数拆成两个不同素数的和,有几种拆法呢?
- 思路
先写一个判断素数的函数。因为输入的是偶数,所以i从2开始循环到偶数的一半减一,判断i是否为素数,再定义一个数为偶数减去是素数的i,再次判断它是否为素数即可,如果是,就+1。
- 细节
用bool 类型定义函数
- 源代码
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;
bool sushu(int n)
{
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return false;
return true;
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
int sum=0;
for(int i=2;i<n/2;i++)
{
if(sushu(i))
{
int a;
a=n-i;
if(sushu(a))
sum++;
}
}
cout<<sum<<endl;
}
}
}
Problem 15(第二套1007)
- 有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
例如:
x + y = 9,x * y = 15 ? 找不到这样的整数x和y
1+4=5,1*4=4,所以,加起来等于5,乘起来等于4的二个整数为1和4
7+(-8)=-1,7*(-8)=-56,所以,加起来等于-1,乘起来等于-56的二个整数为7和-8 - 题意
输入数据为成对出现的整数n,m(-10000<n,m<10000),它们分别表示整数的和与积,是否有这样的整数。
- 思路
直接将i从-10000循环到10000,定义一个数为和减去i,再判断乘积是否为输入的积。
- 源代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
while (cin>>n>>m)
{
if(n==0&&m==0)
break;
int a=0;
for(int i=-10000;i<10000;i++)
{
int j;
j=n-i;
if(i*j==m)
a=1;
}
if(a==0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}