《c++程序设计》课程设计报告
班级:数学三班 学号:2018212794
报告人姓名:高樱洁
实验地点: 东校区413机房
完成起止日期:2019.1.2—2019.1.4
Problem D
题目简介:判断区间内变量对应表达式的值是否全为素数。
思路:数据有多组,所以是多组输入;对于每个值都要进行相同的操作,即判断函数值是否为素数,所以自定义函数,以简化程序。
细节:判断全为素数时,可定义一个变量,比较变量与区间个数的大小;
要输出的“OK”全为大写,为防止出错,可直接复制粘贴;
注意换行;
用while(cin>>x>>y,!(x==0&&y==0))控制数据输入及结束。
源代码:#include
#include
using namespace std;
int prime(int);
int main()
{
int x,y,m;
while(cin>>x>>y, !(x==0&&y==0))
{
int k=0;
for(int i=x;i<=y;i++)
{
m=i*i+i+41;
if(prime(m))
k++;
else
{
cout<<"Sorry"< break; } } if(k==y-x+1) cout<<"OK"< } } int prime(int n) { for(int i=2;i<=sqrt(n);i++) { if(n%i==0) return 0; } return 1; } Problem F 题目简介:求长为n的递增偶数序列,每m个数的平均值,最后的以实际个数求平均值。 思路:分别设置变量控制m个数及m个数的和 细节:记和变量及时清零; 数据之间空格间隔,行末无空格。 源代码: #include using namespace std; int a[100]; int main() { int n,m,j; while(cin>>n>>m) { int k=0; for(int i=1;i<=n/m;i++) { int sum=0; if(k>0) cout<<" "; for(j=1;j<=m;j++) { k+=2; sum+=k; } cout< } if(n%m) { int sum=0; for(j=1;j<=n-n/m*m;j++) { k+=2; sum+=k; } cout<<" "< } cout< } return 0; } Problem H 题目简介:有一母牛每年生一头小母牛,小母牛第四年成为母牛,求n年时有多少牛。 思路: 先算一下前几年的母牛数,发现数排列起来为:1,2,3,5,8……,满足递推关系f(n)=f(n-1)+f(n-2),即斐波那契数列。 细节:不要忘记边界情况,把前几项单独列出。 源代码: #include using namespace std; int main() { int n; while(cin>>n,n!=0) { int f1=1,f2=2,f3=3,f4; for(int i=3;i<=n;i++) { f4=f3+f1; f1=f2; f2=f3; f3=f4; } if(n>1) cout< else cout<<"1"< } return 0; } Problem K 题目简介:有100、50、10、5、2、1元六种纸币,问最少准备多少张可以都不用找零。 思路:工资一定,纸币面值越大,张数越少,所以对工资进行除运算与模运算 细节:注意求一元纸币时不能直接2取余,可以工资减去其它纸币总和; 对所有老师工资进行处理,别忘记加和; 每组数据都要对变量重新赋初值。 源代码:#include using namespace std; int a[110]={0}; int s[110]; int main() { int n,x; while(cin>>n,n!=0) { int k=0; for(int i=1;i<=n;i++) { cin>>a[i]; int b[7]; b[1]=a[i]/100; b[2]=(a[i]%100)/50; b[3]=(a[i]%50)/10; b[4]=(a[i]%10)/5; b[5]=(a[i]%5)/2; b[6]=a[i]-b[1]*100-b[2]*50-b[3]*10-b[4]*5-b[5]*2; s[i]=b[1]+b[2]+b[3]+b[4]+b[5]+b[6]; k+=s[i]; } cout< } return 0; } Problem L 题目简介:判断回文串 思路:对字符串两头一块操作,判断对应位置字符是否相同 细节:循环条件i 注意对字符串的读取与部分调用 源代码: #include #include #include using namespace std; char s[100]; int main() { int n,l; cin>>n; getchar(); while(n--) { gets(s); l=strlen(s); int i=0,j=l-1; while(i { if(s[i]!=s[j]) break; i++; j--; } if(i>=j) cout<<"yes"< else cout<<"no"< } return 0; } Problem N 题目简介:计算时间之和。 思路:时、分、秒对应相加,逢六十进一 细节:对于分和秒,最大为59,当大于等于六十时,对应前面一个单位要加一,本身要减六十; 输出数据之间空格间隔,注意最后一个数据之后不能有空格。 源代码: #include using namespace std; int ah[60]; int am[60]; int as[60]; int bh[60]; int bm[60]; int bs[60]; int ch[60]; int cm[60]; int cs[60]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>ah[i]>>am[i]>>as[i]>>bh[i]>>bm[i]>>bs[i]; ch[i]=ah[i]+bh[i]; cm[i]=am[i]+bm[i]; cs[i]=as[i]+bs[i]; if(cm[i]>59) { cm[i]=cm[i]-60; ch[i]++; } if(cs[i]>59) { cs[i]=cs[i]-60; cm[i]++; } } for(int i=1;i<=n;i++) cout< return 0; } Problem P 题目简介:求A^B的后三位所表示的数 思路:A^B增长的快,当到达一定数时,数据溢出,可以拆分计算,后三位只与后三位有关,因此只需关注每次计算的后三位数即可,最后1000求余 细节:注意b==0时的情况,恒为一; 拆分时,注意b为偶数、奇数的情况讨论。 源代码:#include #include int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF,!(a==0&&b==0)) { int c=1,m=0; while(b>1) { if(a>1000) a=a%1000; if(b%2==1) { c*= a; a=pow(a,2); b=(b-1)/2; } else { c*=1; a=pow(a,2); b=b/2; } if(c>1000) c=c%1000; } m=c*a%1000; if(b==0) m=1; printf("%d\n",m); } return 0; } Problem T 题目简介:龟兔赛跑,龟有电动车,分电动和脚蹬两种情况,兔匀速,判断龟能不能赢 思路:龟用最佳方案进军,所以每两个站点之间都采用最佳方案,将每个站点都作为终点考虑,求乌龟到每个站点时的最快速度。 细节:刚开始的时候车满电,不需要充电 源代码: #include using namespace std; int main() { int l, n, c, t, vr, v1, v2,s; double t1,time; double a[1010]; while (cin>>l) { int p[110]={0}; cin>>n>>c>>t>>vr>>v1>>v2; for (int i=1;i<=n;i++) cin>>p[i]; p[n+1]=l; a[0]=0; t1=l*1.0/vr; for(int i=1;i<=n+1;i++) { double min=1000000; for(int j=0;j
{ s=p[i]-p[j]; if(c>=s) time=s*1.0/v1; else time=c*1.0/v1+(s-c)*1.0 /v2; if(j) time+=t; if(min>a[j]+time) min=a[j]+time; } a[i]=min; } if (a[n+1]>t1) cout<<"Good job,rabbit!"< else cout<<"What a pity rabbit!"< } return 0; } Problem U 题目简介:手机短号为6加手机号后五位,输出手机短号 思路:直接对号码进行求余运算。 细节:注意若后五位的前几位有0存在时,若直接输出结果漏零。 源代码: #include using namespace std; int main() { int n,a; long long m; cin>>n; for(int j=1;j<=n;j++) { cin>>m; a=m%100000; if(a/10000!=0) cout<<"6"<
else if(a/1000!=0) cout<<"60"<
else if(a/100!=0) cout<<"600"<
else if(a/10!=0) cout<<"6000"<
else cout<<"60000"<
} return 0; } Problrn W 题目简介:含62或4的数字是不吉利的,求区间中吉利的号码有多少。 思路:对车牌号不断进行除运算与模运算,判断是否含有4或62,由于进行该操作数次,所以自定义函数。 细节:将一个大区间内所有号码提前判断,存入数组中,最后直接调用数组。 源代码: #include #include using namespace std; int num[1000000]; int judge(int x) { while(x) { if(x%10==4||x%100==62) return 1; x/=10; } return 0; } int main() { int n,m; for(int i=1;i<=1000000;i++) num[i]=judge(i); while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; int s=0; for(int i=n;i<=m;i++) if(num[i]==0) s++; cout< } return 0; } Problem A(2) 题目简介:每天吃掉的桃子是前一天剩下的一半多一个,到第n天准备吃时,只剩下一个,求第一天开始吃的时候一共有几个。 思路:每天吃的桃与前一天有关,知最后一天数目,可利用递推,从后往前倒推进行。 细节:递推函数中,循环条件是day!=1,而不是day!=0。 源代码: #include using namespace std; int t(int); int main() { int n,s; while(cin>>n) { cout< } return 0; } int t(int day) { int s=1; while(day!=1) { s=(s+1)*2; day--; } return s; } Problem B(2) 题目简介:一排两个座位,男女同坐,只有找到同伴的人可以去坐。 思路:从一部分开始,挨个查找匹配对象,已经找到的,不再考虑。 细节:计数变量在相应的区域定义,以免出错。 源代码: #include #include #include using namespace std; int l[550][550]; int v[550]; int g[550]; int m; int f(int); int main() { int k,a,b,n; while(cin>>k,k!=0) { cin>>n>>m; int sum=0; memset(l,0,sizeof(l)); memset(g,0,sizeof(g)); for(int i=1;i<=k;i++) { cin>>a>>b; l[a][b]=1; } for(int i=1;i<=n;i++) { memset(v,0,sizeof(v)); if(f(i)) sum++; } cout< } return 0; } int f(int x) { for(int i=1;i<=m;i++) { if(l[x][i]==1&&v[i]==0) { v[i]=1; if(g[i]==0||f(g[i])) { g[i]=x; return 1; } } } return 0; } Problem C(2) 题目简介:求两个点分别和原点的连线的夹角的大小。 思路:利用数学余弦公式cosα=(a^2+b^2-c^2)/2ab,再利用数学函数acos求出夹角。 细节:数据为实数,可能为负; 定义常量pi。 源代码: #include #include #include #define pi 3.1415926 using namespace std; int main() { int t; double x1,y1,x2,y2; double a,b,c,coso,jiao; cin>>t; while(t--) { cin>>x1>>y1>>x2>>y2; a=sqrt(x1*x1+y1*y1); b=sqrt(x2*x2+y2*y2); c=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); coso=(a*a+b*b-c*c)/(2*a*b); jiao=acos(coso)*180/pi; printf("%.2lf\n",jiao); } return 0; } Problem D(2) 题目简介:一个整数能被另一个整数整除,求该数可能的后两位。 思路:后两位从00—99,利用循环将相应的数求出来,判断能否整除。 细节:注意后两位数为00——09时如何输出; 行末没有空格。 源代码: #include using namespace std; int main() { int a,b; while(cin>>a>>b,(a!=0&&b==0)||(a==0&&b!=0)||(a!=0&&b!=0)) { int k=0; for(int i=00;i<100;i++) { if((a*100+i)%b==0) { if(k!=0) cout<<" "; if((i==0)||(i/10)==0) cout<<"0"<
else cout<
k++; } } cout< } return 0; } Problem F(2) 题目简介:sky数的十进制、十六进制、十二进制数表示的四位数字之和均为22,判断一个四位数是不是sky数。 思路:十进制转化为十六、十二进制的方法相同,自定义一个函数转化进制,并求各位数。 细节:输出字符串时,注意大小写。 源代码: #include using namespace std; int f(int,int); int main() { int n; while(cin>>n,n!=0) { if(f(n,10)==f(n,12)&&f(n,10)==f(n,16)) cout< else cout< } return 0 ; } int f(int n,int r) { int sum=0,s; while(n!=0) { s=n%r; n=n/r; sum+=s; } return sum; } Problem H(2) 题目简介:知等腰三角形的高,用所给符号打印出空心三角形。 思路:利用数学,找出前n-1行字符所在位置特点,利用循环与条件语句打印,单独打印最后一行。 细节:行末无多余空格; 每两个三角形之间相隔一行; 最后一个三角形后无空行。 源代码: #include #include #include using namespace std; int main() { char a; int b,i,j,k=0; while(cin>>a,a!='@') { ++k; getchar(); cin>>b; getchar(); if(k>1) cout< for(i=1;i
{ for(j=1;j<=b+(i-1);j++) { if(j==b-(i-1)||j==b+(i-1))