---恢复内容开始---
#一、PTA实验作业题目1:使用函数判断完全平方数
1.本题PTA提交列表
2.设计思路
1.将表达式根号n强制转换成整型
2.判断根号n是否等于转换类型后的根号n
3.如果等于,返回1,否则返回0
3.本题调试过程碰到问题及PTA提交列表情况说明
-
遇到的问题:写的代码过于取巧,想用输入一个数判断参数n是否为完全平方数,但是这个方法只能取特殊值才有效,例如检查点2的100就如此,需要输入的数是10才能输出YES的结果,其他数就满足
-
解决方法:翻看书本看到了强制转换类型的例子,抱着试一试的想法尝试了一下,发现结果可行
题目2:使用函数验证哥德巴赫猜想
1.本题PTA提交列表
2.设计思路
1.调用prime函数判断p是否为素数
2.定义整型变量count存放判断p是否为素数的结果,循环变量i
3.对count赋初值0
4.如果p能被i整除,则count++
5.如果p!=1且count=0,则p是素数,返回1,否则返回0
6.调用Goldbach函数输出n的素数分解式
7.定义循环变量i和j
8.判断n是否为素数,是的话进入循环
9.i=2,i<n,i++
10.判断i是否为素数,是的话j=n-i
11.判断j是否为素数,是的话输出n=i+j的分解式,跳出循环
12.重复步骤8
3.本题调试过程碰到问题及PTA提交列表情况说明
- 遇到的问题:判断素数设置的范围不够精确,不能够判断m=n和1的情况
- 解决方法:将判断素数的函数范围修改即可
题目3:求组合数
1.本题PTA提交列表
2.设计思路
1.声明fact函数
2.定义整型变量m和n
3.输入m和n
4.如果m=n,输出result=1后换行
5.如果m!=n,四舍五入输出result=n!/(m!(n-m!)
6.调用fact求阶乘
7.定义循环变量i和j
8.i=1,i<=n,i++
9.定义双精度浮点变量item=1
10.j=1,j<=i,j++
11.item=itemj,计算阶乘
12.返回item的值
3.本题调试过程碰到问题及PTA提交列表情况说明
- 遇到的问题:当m==n/2时一直通过不了,Dev调试也都是对的
- 解决方法:将item的数据类型从整型改成双精度类型即可
二、同学代码结对互评
1.同学互评照片
徐宏伟
2.我的代码、互评同学代码截图
选择的题目:使用函数输出指定范围内的水仙花数
我的代码
if(number>1000) //如果number是四位数//
{
bit=number%10; //计算个位数//
ten=number/10%10; //计算十位数//
hund=number/100%10; //计算百位数//
thou=number/1000%10; //计算千位数//
if(thou*thou*thou*thou+hund*hund*hund*hund+ten*ten*ten*ten+bit*bit*bit*bit==number)
return 1; //判断是否满足水仙花数的条件,如果满足返回1//
else
return 0; //否则返回0//
}
if(number<1000) //如果number是三位数//
{
bit=number%10; //计算个位数//
ten=number/10%10; //计算十位数//
hund=number/100%10; //计算百位数//
if(hund*hund*hund+ten*ten*ten+bit*bit*bit==number)
return 1; //判断是否满足水仙花数的条件,如果满足则返回1//
else
return 0; //否则返回0//
}
}
void PrintN( int m, int n ) //调用函数输出m到n内的水仙花数//
{
int i,bit,ten,hund,thou; //定义整型变量bit存放个位数,ten存放十位数,hund存放百位数,thou存放千位数,循环变量i//
for(i=m+1;i<n;i++)
{
bit=i%10; //计算个位数的值//
ten=i/10%10; //计算十位数的值//
hund=i/100%10; //计算百位数的值//
if(hund*hund*hund+ten*ten*ten+bit*bit*bit==i) //判断是否满足水仙花数的条件//
printf("%d\n",i); //如果满足输出i的值后换行//
}
for(i=m+1;i<n;i++)
{
bit=i%10; //计算个位数的值//
ten=i/10%10;//计算十位数的值//
hund=i/100%10; //计算百位数的值//
thou=i/1000%10; //计算千位数的值//
if(thou*thou*thou*thou+hund*hund*hund*hund+ten*ten*ten*ten+bit*bit*bit*bit==i) //判断是否满足水仙花数的条件//
printf("%d\n",i); //若满足输出i的值后换行//
}
}
同学的代码
int count=0;//计算number为几位数
num1=num2=number;//number的值给num1和num2
do{//该循环计算number位数
num1/=10;//去掉一位count+1
count++;
}
while(num1!=0);//number为0退出循环
for(i=1;i<=count;i++){
bit=num2%10;//取出每一位数
num2/=10;//去掉取出的位数
item=1;
for(j=1;j<=count;j++){//该循环计算number每一位数n次幂
item*=bit;
}
sum+=item;//计算number每一位数n次幂和
}
if(sum==number)return 1;//sum与number比较,相等返回1,否则返回0
else return 0;
}
void PrintN( int m, int n )
{
int i;
for(i=m+1;i<n;i++){//只需要判断(m,n)区间即可
if(narcissistic(i))
printf("%d\n",i);
}
}
3.我和同学代码不同在哪里?有哪些各自优势?
- 不同点:宏伟同学判断水仙花数位数的方法与我的方法不同,是拓展性较高的方法;第二个函数判断输出水仙花数时我也忘了调用函数,可是使代码更加简洁
- 各自的优势:我的代码相对来说没有什么优势,还停留在刚认识水仙花数的状态,代码较为复杂,但是思考时间短;宏伟同学的代码判断位数的代码明显优于我的代码,它能判断四位数以上的水仙花数,而且还能输出各个位数上的幂次方的结果
- 更喜欢谁的代码:更喜欢宏伟同学的代码,简洁且拓展性高
三、本周PTA排名
四、本周学习总结
1.1我学会了什么?
1.C语言哪些数据类型
- 整型(short int long)、浮点型(float double)、字符型(char)、整型常量、字符型常量和实型常量
1.2字符型数据需要注意地方?
- 用scanf输入和printf输出的时候需要%c而不是%d,getchar()输入的时候需要加单引号
- 字符型常量和字符型变量要区分清楚,如‘A’和A是完全不同的两个数据
1.3 自增自减运算符?
- ++j和j++是完全不同的,++j中j的值加一,整个表示式的值也加一,而j++中j的值加一,但是j++整个表达式的值不变;自减同自增
1.4运算符优先级?
- 优先级从低到高分别是:逗号运算符、赋值运算符、逻辑运算符&&和||、关系运算符、算术运算符和逻辑运算符!
1.5C语言哪些表达式?课堂派哪里做错,做错的请在这里分析原因?
- 算术表达式、赋值表达式、关系表达式、逻辑表达式、条件表达式和逗号表达式
- 课堂派第二题,当时不明白y*x++的含义,直接将x的值加一乘以y;第三题,忘记a的值在计算后变化了,仍然用a=3的值去计算;第四题,书本没有认真看细看全,当表达式为真时,值为1;第五题,题目要求的是表达式的值,而我计算出来有两个答案只好选了不确定
1.6其他内容?
- 了解了C语言特有的位运算符,&与,|或,^异或,~取反,<<左移,>>右移动
- 了解了强制转换类型的运算及优先级,如double(10/4)=2.0
- 了解了基本数据类型中整型还有short、long、unsigned、unsigned short和unsigned long的分类
2.本周的内容,我还不会什么?
- 表达式计算优先级偶尔记错导致计算错误
- 自增自减运算符的意义还不是了解得很透彻,表达式复杂一点就容易算错,如课堂派第二题y*x++
- 条件表达式偶尔会忘记它的值只有0和1,如课堂派第四题8>6>3
3.循环结构上机考试总结
1.哪题做错了,怎么改?
- 第四题素数判断的方法有问题,导致输出不了,后来发现是自己写的条件有问题,修改后即可;第五题由于时间不充足导致完全没写
2.考试结果满意么,怎么改进?
- 考试结果不满意,由于在简单题浪费了许多时间导致后两题没有时间思考,我这次的目标是打算做完四题的;在简单题浪费时间还是因为自己的熟练度不够以及差错能力不行导致,以后需要加强在平时训练的差错能力及思维能力
3.其他总结
- 现在感觉学得有点吃力,一题代码要比别人多出很多时间来敲,效率不高还占用其他科目的时间容易导致恶性循环,且我发现我的思维能力增加效果不明显,总是将简单的题目复杂化,将自己绕进一个死循环里出不来
- 我打算减少玩游戏的时间多抽一点时间来研究别人简洁易懂效率高的代码,同时锻炼自己的思维能力