C语言博客作业--函数
一、PTA实验作业
题目1.6-7使用函数输出指定范围内的完数
1.本题PTA提交列表
2.设计思路
-
在factorsum函数中,定义整形变量i=0,sum=0
-
进入 do while 循环
-
i++
-
if (number%i != 0) continue;
else sum += i; -
循环进入的条件是while (i < number-1);
-
返回sum
-
在PrintPN函数中,定义整形变量flag ,i,j
-
如果 m>n执行判断语句让m与n的值交换if (m > n) {
int z;
z = m;
m = n;
n = z;
} -
for (i = m; i <= n; i+=2)
-
if (i % 2 == 1) i++;
-
如果factorsum(i) == i&&i>=2
-
flag=1 输出("%d = 1", i);
-
j=1
-
进入 内嵌do while 循环
-
j++
-
if (i%j == 0) printf(" + %d",j);
-
循环继续的条件是while (j < i / 2);
-
换行
-
如果factorsum(i) == 1
-
输出1 = 1\n 并且flag=1
-
在for循环结束后判断如果flag==0 输出No perfect number
3.本题调试过程碰到问题及PTA提交列表情况说明。
在刚开始的时候我实现了函数的所有功能,提交PTA的但是显示在最大范围内一直超时,完全不知都从何处优化
我就在思考,最大范围应该指的是从1到10000内所有的完数,我觉得应该把所有的完数都试着输出一下
我发现除了1之外,所有的完数都是偶数,这就代表着奇数可以不用判断,可以让我的代码的时间复杂度减少一半
让后我就把我的for循环的执行语句从i++改成i+=2,并且如果i是奇数,通过i++的方式让其变成偶数,完美解决问题,可能还有其他完数的规律 但是懒得找了
题目2.6-8使用函数输出指定范围内的Fibonacci数
1.本题PTA提交列表
2设计思路
-
在fib函数中 定义变量i=1,a=1,b=1
-
如果 n1或者n2,直接返回1
-
当i为真时,进入while循环
-
i++
-
a=a+b;
-
b=b+a;
-
如果i==(n+1)/2进入判断语句
-
再判断n如果是奇数,返回a,不然返回b
-
在PrintFN函数中
-
定义整形数组res[100],j=0,flag=0
-
如果m>n让m和n的值交换if (m > n) {
int z;
z = m;
m = n;
n = z;
} -
for (int i = 1; i<=100; i++)
-
如果fib(i) >= m&&fib(i) <= n
-
让fib(i)的值赋给res[j],并且j++
-
flag=1
-
for (int i = 0; i < j; i++)
-
输出res[i]的值
-
如果i不等于j-1 则输出空格
-
如果flag==0,则输出No Fibonacci number
3.本题调试过程碰到问题及PTA提交列表情况说明。
这道题的难点就在于如何让最后一个数不输出空格,其他的都比较简单。我想了两个方法,第一个方法用数组,把每次要输出的值都交给数组res[j],然后让i和j进行判断,如果i不等于j-1,则都输出空格,也就是说把输出值和输出空格这两件事独立起来分开判断。第二个方法就是再定义一个变量cnt=1用来做计数器,在每次输出前判断cnt的值,如果cnt==1,则单独输出一个数,cnt为其他值则输出空格+数,cnt++
题目3.7-1求组合数
1.本题PTA提交列表
2.设计思路
- main函数中,定义整形变量m,n
- 如果m<=n,输出result = %.0f", fact(m, n)
- 在fact函数中,定义double型变量 numberator=1,denominator=1
- for (int i = n; i >= n-m+1; i--)
numberator *= i;
for (int j = m; j >= 1; j--)
denominator *= j;
return numberator / denominator;
3.本题调试过程碰到问题及PTA提交列表情况说明。
这道题并没有想题目那样那么麻烦,并不用向题目中那样需要算m!,n!和(n-m)!,高中学过,组合数公式等价于[m(m-1)···(m-n+1)]/[n(n-1)···1],实现后面这个算法就可以计算出组合数了
二、同学代码互评
1.互评照片
2.我的代码、互评同学代码截图
6-7使用函数输出指定范围内的完数
我的代码
吴越的代码
3.和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
在吴越代码中,factorsum函数中,他用了if语句将number1的情况分离出来判断,然后用一个for循环判断当number>1的情况。而我的代码是直接用一个do while 循环把所有的情况都包容进去了,我的代码在这方面做的比吴越的好。而且五月的代码在最后还要判断sum是否num,这个是没有必要的,因为主函数中的if语句才是判断返回的值是否和原数相当的语句,没必要在函数中判断。在factorsum函数中 ,我更喜欢我的代码
printfPN函数中,吴越的代码不全,不做评论
三、截图本周题目集的PTA最后排名。
四、本周学习总结?
1.你学会了什么?
1.1C语言那些数据类型?
- 基本数据类型,如:整型,长整型,短整型,无符号整型,无符号长整型,无符号短整型,字符型,单精度浮点型,双精度浮点型。
1.2字符型数据需要注意地方?
- 每个字符型数据在内存中占一个字节。
- 整型变量和字符型变量的定义和值可以互换。
1.3自增自减运算符?
- n++相当于先执行语句,在语句结束后执行n+=1,++n相当于先执行n+=1,再执行语句,n--,--n同理
1.4运算符优先级?
- 初等运算符>单目运算符>算术运算符>移位运算符>关系运算符>位逻辑运算符>逻辑运算符>三目运算符>赋值运算符>逗号运算符
- 单目运算符,赋值运算符,三目运算符和赋值运算是从右到左结合。
1.5C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
- 赋值表达式,逻辑表达式,条件表达式,关系表达式。
- 没有
2.本周的内容,你还不会什么?
- 遇到一些陌生的运算符还不太会用,需要多多练习
3.循环结构考试总结
1.哪题做错了,怎么改?
最后一道题时间不够,只实现的最基本的功能,但是一些特殊的要求还没有实现,感觉自己的思维还是不够灵敏,一些想法还是出现的太晚了
2.考试结果满意么,怎么改进?
不太满意,多练习,看看别人的代码,学习一下别人的代码的有点,而且平常用惯了VS 觉得用devc十分的难用,刚开始都不知道如何调试,导致我的代码如果出问题都是直接用脑子模拟代码的输出和各个变量的计算,十分浪费时间,只有到最后一题,才开始学习如何用devc调试,浪费了很多时间