《c++程序设计》课程实验报告
班级:数学四班 学号:2018212741
报告人姓名:周小皓
实验地点:教学楼414
实验起止日期:2019年1月2日——2019年1月5日
课程设计题解报告
Problem D
1.(1)题意:判断一个多项式在区间(x,y)内的每一个取值是否为素数。
(2)解题思路:判断一个数是否为素数,我们可以写一个函数进行判断,然后使用for循环遍历区间内的每一个数,同时不要忘了要多组输入。
(3)源代码:
(4)注意问题:要注意换行和空格,以及输出字符的大小写。
Problem E
2.(1)题意:求一个多项式的前N项和。
(2)解题思路:该多项式的通项为(-1)(n+1)*(1/n),当n为奇数时是正的,当n为偶数时为负的,所以我们可以把该多项式分成奇数项和偶数项,应用for循环分别进行加和,i每次+2;由于有多组数据,所以应用多组输入。
(3)源代码:
(4)注意事项:每一次进行循环时都应对s和t进行初始化,即赋值为0.最后输出的多项式的值要保留两位小数。
Problem H
3.(1)题意:有一头母牛,每年生一头小母牛,小母牛四年成熟,变成大母牛,也一年生一头小母牛,求第N年有几头母牛。
(2)解题思路:通过找规律我们发现,小母牛第五年才开始生牛,所以第N年的牛是第N-1年的牛和第N-3年的牛的数量总和,所以这是一个递推式,使用for循环我们可以求出第N项,即第N年母牛的数量。
(3)源代码:
注意实项:for循环应从n=4时开始;
Problem L
4.(1)题意:判断一个字符串是否为回文串(回文串”是一个正读和反读都一样的字符串)。
(2)判断一个字符串是否为回文串我们应该对字符串中的每个字符进行比较,应用size求出字符串的长度,然后使用for循环进行比较,用if语句进行判断。
(3)源代码:
(4)注意事项:注意每一次循环都应使sum=0;即sum要初始化,否则sum会越加越大,得不出正确答案。
Problem M
5.(1)题意:输入一个十进制数N,将其转换成R进制输出。
(2)解题思路:这个题有多组数据,我们首先要用while语句进行多组输入,由于不知道N是正是负或者为0,我们首先要用if语句进行判断,N=0,直接输出,N<0,令N=-N,用一个变量进行记录,如flag=1;N>0,不做处理,用while语句对N进行磨余,每次都令N%R;然后N/=10;用数组储存0所得到的数据,然后逆序输出数组,进行判断如果flag=1,应该先输出一个“-”对数组中的元素进行判断,如果<=9,直接输出,如果大于9,进行强制类型转换,将其转换成字符。
(3)源代码:
(4)注意事项:应注意开始对变量初始化,一组输出后应换行。
Problem O
6:(1)题意:求两个集合的差集。
(2)解题思路:我们首先要判断集合A中的元素是否都在集合B中,不在的记录下来,构成数组C用一个变量记录集合A中与集合B中相同元素的个数,如果等于n,即数组C为空集,则输出“NULL”,小于n,对行排序。
Problem P
7.(1)题意:求AB的后三位。
(2)解题思路:由于AB可能会很大,超出long long的取值范围,而我们又知道两个数相乘的后三位只与这两个数的后三位相乘有关,即减少了运算量,也不会超出范围,运用for循环便可求出。
(3)源代码:
(4)注意事项:应提前求出a的后三位为p,在令a=1,然后领a先除余,在与p相乘,循环。
Problem W
8.(1)题意:称带有4和62的的号码为不吉利号码,求一个区间内不是不吉利号码的号码有几个。
(2)解题思路:我们可以写个函数来判断一个数是否含有4或62,用bool型变量定义函数,用while语句进行循环,如果x%10=4或x%100=62,就return true,然后x=x/10;进行循环,下面用for循环遍历区间内的每一个数,使用函数进行判断,求出不吉利号码的个数,然后用总数减去不吉利号码的个数,就是不是不吉利号码的号码的个数。
(3)源代码:
(4)注意事项:要把num初始化,以及sum=n-m+1-num,不要忘记加一。
Problem V
9.(1)题意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
若给出A0, An+1, 和 C1, C2, .....Cn.
请编程计算A1 = ?
(2)解题思路:这是一个方程,只知道两个数A0和An+1求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)
(3)源代码:
Problem C
10.(1)题意:求两点与原点的连线的夹角的大小。
(2)解题思路:我们可以利用向量求出两条直线夹角的余弦值,然后利用反三角函数求出两条直线的夹角。。
(4)注意事项:注意要定义宏常量PI=acos(-1.0),由于有多组数据,不要忘记多组输入,变量要用double定义,调用函数需要写函数的头文件,输出后要换行。
Problem H
11.(1)题意:输出字符等腰空心三角形。
(2)解题思路:利用for循环和if语句进行循环判断,找到规律,输出,如i=n,i+j=n+1,j-i=n-1,时输出字符。
(3)源代码:
(4)注意事项:题目要求每行后不要用空格,所以要判断什么时候输出空格,什么时候输出字符,不能在行末输出空格,输出多个字符三角形要注意换行,输入@时结束。
Problem F
12.(1)题意:如果一个数的十进制十二进制和十六进制的各数位之和想等,那么称这个数为Sky数,验证一个数是不是Sky数,是输出“#n is a Sky number”,不是输出“#n is not a Sky number”。
(2)解题思路:利用while语句对n不断求余,求出十进制,十二进制,十六进制时各数位之和,然后用if语句判断是否相等。
(3)源代码:
(4)注意事项:由于多组输入,所以每一次循环都需要把变量初始化,同时要注意换行。
Problem G
12.(1)题意:有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在
(2)解题思路:我们设其为a和b,已知m和n,令m=a+b,n=a*b,所以可得到关于a和b的方程:
b2-b*m+n=0,所以要判断a和b是否存在,只需判断该方程是否有解,即判断n2-4*m是否大于等于零。
(3)源代码:
(4)注意事项:要注意判断a-b是否等于c*c。
Problem D
13.(1)题意:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?
(2)解题思路:使用for循环去寻找,看能否被整除。
(3)源代码:
Problem T
14 .(1)题意:兔子能够毫不休息得以恒定的速度(VR m/s)一直跑,这辆车在有电的情况下能够以VT1 m/s的速度“飞驰”,可惜电池容量有限,每次充满电最多只能行驶C米的距离,以后就只能用脚来蹬了,乌龟用脚蹬时的速度为VT2 m/s。更过分的是,乌龟竟然在跑道上修建了很多很多(N个)的供电站,供自己给电动车充电。其中,每次充电需要花费T秒钟的时间。当然,乌龟经过一个充电站的时候可以选择去或不去充电,判断乌龟用最佳的方案进军时,能不能赢了一直以恒定速度奔跑的兔子。
(2)解题思路:先考虑可能在任意一个加油站作为乌龟最后加油的地方,然后利用递推的思想逐个求和,比如乌龟可能把第二个加油站作为最后加油的地点,由此我们需要依次求出把原点作为前一个加油站到第二个加油站的时间和把第一个加油站作为前一个加油站到第二加油站的时间,然后比较两种路径所用时间的多少求出把第二个作为最后加油站所用的最短时间,以此类推,以后各种情况均可由此法求得。
(3)源代码:
Problem S
15.(1)题意:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
(2)解题思路:计算蜜蜂爬1,爬2,爬3,…,爬n,我们发现这是一个递推式,从第三个蜂房开始,第n个蜂房的路线数等于第n-1个蜂房的路线数+第n-2个蜂房的路线数,而从第一个蜂房到第四个蜂房与第三个蜂房到第六个蜂房的路线数是一样的,所以我们可以用for循环利用递推关系式求出从第一个蜂房到n个蜂房的路线数(0)
然后将(b-a)带人,求出蜜蜂从蜂房a到蜂房b的路线数。
(3)源代码: