C语言第五次博客作业
一、PTA实验作业
题目1:6-6 使用函数输出水仙花数
1. 本题PTA提交列表
2. 设计思路
- (1) 首先先定义narcissistic函数。
- (2)定义四个整形变量n,a,d,cnt,sum,cnt用来计算有几位数,sum用来存放每个数的cnt次方的和。
- (3)进行一个循环,让n=number(防止后面需要用number时它的值发生变化),循环中n=n/10,直到
n<=0结束循环,其中每次循环cnt值都加一,用来计算number有几位数。 - (4)再进行一个for循环(让a=number;直到a不>0;a/=10)
在循环中d=a%10;sum=sum+pow(d,cnt);这部是让每个位数的cnt次方进行相加。 - (5)这里在进行一个判断,如果nunber=sum则说明这个数是水仙花数,则return 1;
否则就return 0; - (6)再进行void PrintN( int m, int n )函数的定义。
- (7)定义一个变量i 用来进行循环
- (8)for(i=m+1;i<n;i++)做循环让它输出这个范围内的水仙花数。
因为在这个区间里的水仙花数不能取m和n,所以给i定义的初值为m+1,
限定条件为i<n。 - (9)if( narcissistic(i) )调用上一个函数 ,判断i是否为水仙花数
printf("%d",i);printf("\n")如果是输出这个数,并换行。
3.本题调试过程碰到问题及PTA提交列表情况说明
- (1)当时在编译这题时,一开始就打算用cnt 来计算number的值。
可是在做题目时一直根据题目给的值153,就把在第4步时把那个cnt输成了3
结果一直导致部分正确。
其中大于三位数后水仙花数就输不出来
- (2)还有一个问题就是在判断完它是水仙花数后不知道要怎样返回这个值。
后开尝试用了下return 1就可以了,运气有些好。
题目2:6-8 使用函数输出指定范围内的Fibonacci数
1. 本题PTA提交列表
2. 设计思路
- (1)int fib( int n )首先定义fib函数
- (2)int a=1,b=1,i.定义三个整形变量(因为题目所给的内容,a,b的初始值都为1,i是后面用来做循环
- (3) if(n1 || n2)return 1;如果n=1,n=2时Fibonacci数都为1
- (4)for(i=3;i<=n;)再进行一个循环,令i=3直到i>n时结束循环。
- (5) a=a+b;i=i+1;b=b+a;i++;这样就能够让前面两个数的值相加成第三个数。
- (6)如果n为奇数则就return a的值
- (7)为偶数就输出偶数的值
- (8)void PrintFN( int m, int n )再进行void PrintFN函数的定义
- (9)int cnt=0,i,j定义三个整形变量i,j,用来进行循环,cnt 是用来判断这个区间内是否有Fibonacci数
- (10)for(i=1;fib(i)<=n;i++) if(fib(i)>=m) printf("%d",fib(i))让每一个Fibonacci数都与m进行比较
- (11)如果fib(i)>=m,就说明这个Fibonacci数在区间内,则输出fib(i)
- (12)if(fib(i+1)<=n) printf(" ");在区间内最后一个Fibonacci数前输入“——”满足行末没有空格。
并且在这个if语句中让cnt=1 - (13)再循环外进行一个判断语句如果cnt=0则输出No Fibonacci number。
3.本题调试过程碰到问题及PTA提交列表情况说明
对于行末不能保留空格一开始没有注意到,所以只在其为空集时正确了
于是我在输出空格前进行了一次判断,如果fib(i+1)<n则说明这个数是区间内倒数第二个数,那么在下一个数的后面就不要再输出空格。
可是,还有错误就是两端点都是F数,测试超过区间的fib不满足条件
所以我就再看了下题目题目中如果m,n是Fibonacci数那么他也是需要输出的。所以在)if(fib(i+1)<n)中加了一个=。就满足条件。
题目1:6-7 使用函数输出指定范围内的完数
1. 本题PTA提交列表
2. 设计思路
本题要求实现一个计算整数因子和的简单函数
- (1)int factorsum( int number )定义这个函数来判断一个数是否为函数
- (2)int i,sum=0;定义sum用来存放因子相加后的值
- (3)if(number==1) return 1;因为1是一定满足有有点特殊,首先拿出来考虑
- (4) for(i=1;i<number;i++) if(number%i==0) sum=sum+i;进行一个循环在<n的范围内而不能=n,
所以1是有点特殊,后面一个判断语句是将i的因子全部相加。 - (5)if(sum==number)则说明这个数是完数,那么就return sum.否则return 0;
- (6)void PrintPN( int m, int n )在进行这个函数的定义
- (7)int i,j,a=1。i,j是用来进行循环,a是用来判断区间内是否有完数
-(8)for(i=m;i<=n;i++) if(factorsum(i) == i)则说明这个数是完数,则printf("%d = 1",i) 因为任何完数都会等于1+多少。
-(9)for(j=2;j<i;j++)在进行一个循环 if(i%j==0)这个是用来判断i的因子,如果是则printf(" + %d",j) - (10)然后在j循环外printf("\n")换行。并使a=0
- (11)进行一个判断if(a==1)就printf("No perfect number")
3.本题调试过程碰到问题及PTA提交列表情况说明
这道题的难点在于 完数 = 因子1 + 因子2 + ... + 因子k 这个格式的输出怎样才能让它正确输出因子的同时,又正确的输出+与空格。
经过观察每个数必有因子1," + %d",j 在以这样的格式一个个输出,我一开始是在每个数的后面加空格,这样导致行末出现空格,
后来经过一个同学的提点,把空格放在+的前面这样就不会在行末出现空格。
行末出现空格
二、同学代码结对互评
2.我的代码、互评同学代码截图
我的代码!
int fib( int n )
{
int a=1,b=1,i;
if(n==1 || n==2){//如果n=1,2时F数都为1
return 1;
}
for(i=3;i<=n;){
a=a+b;//让前两个数相加得到一个新的数
i=i+1;
b=b+a;
i++;
}
if(n%2==0){//判断奇偶数
return b;
}
else{
return a;
}
}
void PrintFN( int m, int n )
{
int cnt=0,i,j;
for(i=1;fib(i)<=n;i++){
if(fib(i)>=m){
printf("%d",fib(i));
if(fib(i+1)<=n){
printf(" ");
}
cnt=1;
}
}
if(cnt==0){
printf("No Fibonacci number");
}
}
黄炳炜的代码
int fib( int n )
{
int result=0,i,a=1,b=1;
if(n==1)return 1;
for(i=2;i<=n;i++)
{
result=b;
b=b+a;
a=result;
}
return result;
}
void PrintFN( int m, int n )
{
int f,i,flag=0,c=0;//f放完数,i控制循环,利用flag判断是否有完数,c,判断是否为第一个数
for(i=1;i<=100;i++)
{
f=fib(i);
if(f>=m&&f<=n)//完数在所给范围内
{
c++;
flag=1;
if(f==1&&m==1&&i==1)//起始点为1比较特殊,直接输出1
{
printf("1");
continue;
}
if(c==1)//第一个数前面没有空格,所以单独输出
{
printf("%d",f);
continue;
}
printf(" %d",f);
flag=1;
}
}
if(flag==0)//没有完数,则flag还是为0,输出。
printf("No Fibonacci number");
}
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题
不同点:我和炳炜同学在定义fib函数的做法不一样,我是让n从三开始进行循环a=a+b,i++,b=b+a,i++当n为奇数时其F数再a上,
偶数时F数再b上。
而炳炜同学是在定义一个变量来存放fib数,result=b; b=b+a; a=result它的循环是从2开始先让result=b,每次都让b=b+a,又再将a=result
这样同样巧妙的将前两个数的和放到了result上
优势:1:我的代码在一步的循环中就能计算多个F数,剪短了循环的时间,并且我不用多定义一个变量也节省了空间。
而,炳炜同学的代码比较精炼,不需要在后面做判断,直接返回result,而我的有两个出口。
2:在第二个函数上,我觉得我的优势会更大,在第一个循环我结束的条件是fib(i)<=n而炳炜同学i<=100,这样 它循环的次数就会更多,时间更长。
然后为了避免在行末输出空格if(fib(i+1)<=n) printf(" ");我是来找nm 区间内的倒数第二个数,而他是让第一个数单独输出,还要多设计一个数来判断区间内的第一个数
总之,它的代码使用的空间和时间都用的比我多。
所以,我会更喜欢我自己的代码。
三、截图本周题目集的PTA最后排名。
四、本周学习总结
1.你学会了什么?
- (1)short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。这周对这些数据类型更深入的进行了学习。
- (2)字符型数据可以与整型通用,例如: 10+'a'+1.5-8765.1234 *'b' 是合法的.
2.本周的内容,你还不会什么?
答:本周还学习了运算符的优先级以及结合性,,还有前缀自增和后缀自增的区别,最重要的是对位运算有了一定的了解,
还有就是学会了怎样将字符的大小写进行替换。
2.本周的内容,你还不会什么?
本周的内容其实我对于,运算符的优先级还是不太清楚,太多了有些混乱,在加上结合性,就更乱了。
还有就是对自增和自减还没有领会。
3.循环结构考试总结
1.哪题做错了,怎么改?
我在二进制的前导的零,这道题目中有一些小错误就是当值为1的时候答案是错的,1情况比较特殊,可以多设计一个判断条件出来
单独分析即可。
然后就是在最后一题的单词长度那题,暂时没有什么思路容我在想想。
2.考试结果满意么,怎么改进?
不满意,一些小细节的地方还是没有注意,效率还是不够高,导致最后一题都没有多少时间去认真思考。
还是需要多加练习,勤能补拙,多与同学老师交流。