一、PTA实验作业
题目1:使用函数输出指定范围内的完数
1. 本题PTA提交列表
2.设计思路
- 第一步:定义函数int factorsum ( int number)返回int number的因子和,定义整型变量i存储循环次数以及表示各个因子,sum用于因子求和
- 第二步:如果number==1,则返回值1
- 第三步:令i的值为1,满足i<=number/2的条件时执行接下来的步骤
- 第四步:如果满足number%i==0的条件,运算sum=sum+i,求因子数和
如果满足i==number/2&&sum==number的条件,返回sum值, - 第一步:令i++,如果满足i<=number/2的条件,则执行第四步
- 第二步:定义函数void PrintPN ( int m, int n )用于逐行输出给定范围[m, n]内每个完数的因子累加形式的分解式,定义整型变量j,k用于存放循环次数,count用于确定范围内是否有因子式存在
- 第三步:令j=m,如果满足j<=n的条件,执行以下步骤
- 第四步:如果满足factorsum(j)==j为判断数j是否满足因子式的条件,再如果j==1,输出(%d = 1,j) 并换行,令count=1
否则输出(%d = 1,j) - 第五步:令k=1,满足k<=j/2的条件,则执行接下来的步骤
- 第六步:如果满足k>=2&&j%k==0的条件中再满足k==j/2的条件则令count=1,输出(" + %d\n",k)
否则输出(" + %d",k) - 第七步:令k++,如果满足k<=j/2的条件执行第六步,否则执行第八步
- 第八步:令j++,如果满足j<=n的条件则执行第四步,否则执行第九步
- 第九步:如果count==0,则输出No perfect number
3.本题调试过程碰到问题及PTA提交列表情况说明
- 问题:发现输出没有1及其因子式1=1
调试发现
当进入PrintPN()时,i=0,number/2=1/2,不满足i<=number/2的条件,所以1进入不了函数factorsum(),不被当做完数 解决方法:
把n==1时单独考虑,当n==1时,返回函数值1,承认1是完数题目2:使用函数输出指定范围内的Fibonacci数
1.本题PTA提交列表
2.设计思路
- 第一步:定义函数int fib ( int n )用于返回第n项Fibonacci数,定义变量J存放循环次数,令number1=1为第一项数,number2=2为第二项数
- 第二步:如果满足n==1||n==2的条件,返回函数值1,
如果满足n>=3的条件,则令j=3,如果再满足j<=n的条件则运算sum=number1+number2(sum存放前两项和)
number1=number2(number1存放sum前一项的数)
number2=sum(把sum的值赋予number2,让number2存放前两项和的新的一项,再通过循环让sum求新的两项和) - 第三步:j++,如果仍然满足j<=n的条件,则执行第二步,否则执行第四步
第四步:返回number2的值给函数
- 第一步:定义函数void PrintFN ( int m, int n ),定义整型变量k存放循环次数,o判断是否有Fibonacci数,h配合t求第h项的Fibonacci数,t代替fib()
- 第二步:令k=m,如果满足k<=n的条件,则执行第三步,否则执行第七步
- 第三步:令h=1,如果满足h<=30,则执行下一步
- 第四步:令t=fib(h),如果满足t==k&&o==0的条件,则令o=1,输出("%d",k),并使用continue语句重新开始一轮循环
如果满足t==k&&o==1的条件,输出(" %d",k),并使用break语法跳出循环 - 第五步:h++,如果满足h<=30的条件,则执行第四步,否则执行第六步
- 第六步:k++,如果满足k<=n的条件,则执行第三步,否则执行第七步
第七步:如果o==0,则输出No Fibonacci number
3.本题调试过程碰到问题及PTA提交列表情况说明
- 问题:最开始打这题代码的时候,函数定义时定义了一个变量i用于判断第几项,结果后来定义了n判断第几项,没有改写原来变量i的地方,函数判断不了第一个输入的数,直接输出,导致答案部分正确
解决方法:调试中发现,当判断Fibonacci数时,并没进去i>3的这个语句,及时改正为n>3,答案正确
改正后:
题目3.求组合数
1.本题PTA提交列表
2.设计思路
- 第一步:声明函数double fact ( int n )
- 第二步:输入整型变量m,n ,用于从n个不同元素中取出m个元素的组合数
- 第三步:定义双精度浮点型变量result用于输出最后结果
- 第四步:输入m,n;
- 第五步:运算result=fact(n)/(fact(m)fact(n-m)),就是求n!/m!(n-m)!
- 第六步:保留0位小数输出输出result
- 定义函数double fact ( int n )
- 第一步:定义整型变量i存放循环次数与用于求阶层
- 第二步:定义双精度浮点型变量sum存放n阶层的值
- 第三步:令i=1
- 第四步:如果满足i<=n的条件,那么运算sum=sum*i,i++,否则执行第六步
- 第五步:如果仍然满足i<=n的条件,那么执行第四步 ,否则执行第六步
第六步:返回函数值sum
3.本题调试过程碰到问题及PTA提交列表情况说明
- 问题:答案错误,发现
解决方法:回去重新审查代码,发现
把sum的类型重新定义为double,答案正确二、同学代码结对互评
志坚同学的代码:
我的代码:- 不同点:1.判断素数时,志坚用的条件是i<=sqrt(p),我的时i<=p,这里他对素数的判断更快速
2.求分解式时,志坚用了一个嵌套循环,i为一个分解数,j为令一个分解数,分别让i=2 j=2~n,i=3 j=2~n,i=3 j=2~n............i=n j=2~n进行判断,满足i+j==n&&prime(i)==1&&prime(j)==1的条件,输出n=p(i)+q(j)
我利用了判断素数函数的返回值1和0,用了一个循环令一个分解数k从2到n,令一个分解数为n-k(不需要再定义一个变量),再直接判断kprime(k)+(n-k)prime(n-k)==n(是素数时返回1再乘以本身得分解数本身,不是素数乘0为0没意义)的条件,满足输出n=p(k)+q(n-k)
就省得再用一个循环去实现另一个分解数 - 我认为我的代码更有优势,减少计算机的计算量,给出答案较快
没有发现志坚同学的代码有错误
三、截图本周题目集的PTA最后排名
四、本周学习总结
1.你学会了什么?
- 1.1C语言里有整型int 数据长度32位,短整型short int 数据长度16位,长整型long int 数据长度32位,无符号整型unsigned int 数据长度32位,无符号长整型unsigned long int 数据长度32位,
字符型 char 数据长度8位,单精度浮点型float 数据长度32位,双精度浮点型double 数据长度64位 - 1.2输入字符型数据时千万不要有一种习惯就是打上空格,除非你要用空格做些判断,否则空格也会被当做字符输入
- 1.3自增运算符++运用为n++ 或++n,自减运算符--运用为n--或--n,前缀和后缀所代表的表达式值不一样
- 1.4运算符优先级学会了看P326-P327的表格
1.5课堂派里y*x++算错了,要x++这个表达式的值与y相乘,原先先算x++了,令值加了1再相乘
2.本周的内容,你还不会什么?
- 二进制位逻辑运算符一点都不熟练,必须看着书慢慢一点一点推敲,碰到题目也不会用,课堂派里的最后一题也不会做,希望老师能多花点时间在这一块内容
3.3.循环结构考试总结
- 第五题求单词长度做错了,第四题二进制前导的零没做。改正:第五题里再写个算法判断空格连续时输出单词长度就可以
- 考试结果不满意,前20分钟就做完了前三道题,第四题会做,但是我先做了第五题,发现第五题有难度,硬是花了所有的时间去想这道题,结果忽略了第四道题
改进:考试时会的题目一定要先做,做完会的题目再去做不会的题目,平时要再多花时间在C语言这门课上 ,要勤于动脑,不做一个推延的人