单循环题目集
嵌套循环题目集
(a)while语句
while(表达式)
{
循环体语句;
}
执行流程:当表达式的值为“真”时,循环执行,直到表达式的值为“假”,循环终止并继续进行while的下一条语句。简单案例:求奇数和
(b)for语句改while语句
表达式1;
while(表达式2)
{
for的循环体语句;
表达式3;
}
(c)do-while语句
min=a;
while(grade>=0)
{
if(grade<min)
{
min=grade;
}
}
执行流程:第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do-while的下一条语句。简单案例:找出最小值
(abc)比较for循环,while循环,和do-while循环的区别。
1)for语句和while语句都是循环前判断条件,只有条件满足时才会进入循环,如果一开始条件就不满足,则循环一次都不执行,但是do-while循环至少会执行一次循环体。
2)一般情况下,如果题目指定了循环次数,用for语句更加清晰,当然也可以用while语句,而如果没有指定循环次数,而是由某一项的值来控制循环,用while循环可能更合适。
(d)break语句与continue语句的应用
1)break语句和continue语句一般用于循环语句中,不过,break语句还可以用在switch-case结构中。在循环语句中,一旦执行了break语句,循环提前结束,不再执行循环体中位于其后的其它语句。break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环;否则,若break无条件执行,都会结束循环,有时需要区分循环的结束条件。
2)continue语句的作用时跳过循环体中continue后面的语句,继续下一次的循环。
简单案例:
小贴士:
min初值:1.输入的第一个数作为初值。2.比输入数都大的数。
max初值:1.输入的第二个数作为初值。2.比输入数都小的数。
(f)二进制转十进制
#include <stdio.h>
int main()
{
char ch;
int num=0;
while ((ch = getchar()) != '\n')
{
num = num * 2 + ch - '0';
}
printf("%d", num);
return 0;
}
这两周代码量 |
---|
816 |
题目:形如2n?1的素数称为梅森数(Mersenne Number)。例如22?1=3、23?1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231?1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。
本题要求编写程序,对任一正整数n(n<20),输出所有不超过2的n次方?1的梅森数。
a)定义变量n存放正整数,
定义end为不超过2的n次方的最大梅森数,
定义digit为梅森数。
b)定义函数Digit(double n)来求梅森数,
定义函数Isprime()来判断是不是素数。
c)
输入成绩;
if(n==1)
没有梅森数;
end if
if(n==2)
输出梅森数3;
end if
for i=2 to end do
调用函数Digit(i)输出梅森数
if(调用Isprime()函数来判断梅森数是否为素数)
如果是,则输出梅森数;
end if
end for
输入数据 | 输出数据 | 说明 |
---|---|---|
1 | None | 没有梅森数 |
2 | 3 | 只有一个梅森数 |
6 | 3 7 13 | 答案正确 |
20 | 3 7 31 127 8191 131071 524287 | 答案正确 |
1.部分正确:对最小整数缺少判断。
2.部分正确:一开始是digit<=end,则会多输出一个梅森数,于是把等号去掉。
3.部分正确:发现等号去掉以后,对n=2不成立,于是n=2另外分析。
a)定义变量N表示几位数
定义term表示N位数的最小值
定义value1表示用来存储帧数分解以后的各个数
定义value2存储这个数的个位数
定义value3存储各个数N次方以后的值
定义sum用来存储这个数各个数的立方和。
b)
定义Mypow()函数用来求N位数的最小值,
定义mypow()用来定义整数的各个数的N次方和。
c)
输入N;
求N位数的最小值term
for i=term to term*10 do
do
{ 取各位:value1=value2%10;
去个位:value2=value2/10;
算N次方和:value3=mypow(value1,N);
sum对各个数N次方和求和
if sum和i相等
输出水仙花数
对sum重新赋值,进行下一次求和
end if
}
end for
输入数据 | 输出数据 | 说明 | |
---|---|---|---|
3 | 153 370 371 407 | 数据正常 | |
2 | 没有 | 异常数据 | |
7 | 1741725 4210818 9800817 9926315 | 数据正常 |
1.答案错误:一开始没有看清题目,所以只是以为是做个的那道题,求三位数的水仙花数,于是提交,答案错误。
2.答案错误:后来发现了,又开始纠结于如果N等于四,等于五,怎么求把每个数分开,那个时候自己脑袋一定是装了浆糊,所以没转过来,在那边纠结了很久,于是错误了很多次,后来才发现只要取余就可以。
3.编译错误:复制过去scanf没改过来。
4.格式错误:最后我纠结的地方在格式,因为我用鼠标弄输出样例,发现前三个数后面有空格,最后一个数没有,于是在那边想了很久,不知道怎么解决,因为对于不同的N,它的水仙花数数量也不是固定的,无法通过限制条件来解决,后来发现是我鼠标弄得方式不对头,于是出现了那种情况,后来就可以了。
1.a)
定义字符型变量ch来存储输入的字母,
定义n来表示输入的行数,
定义mid=(n+1)/2表示中间一行,
定义ch1表示每一行都换成不同的字母。
2.b)
输入ch和n;
算出中间行mid;
for i=1 to n do
for j=1 to j=fabs(mid-i)do
输出空格;
for k=1 to k=n-2*fabs(mid-i))
如果时第一个和最后一个,则输出字母
如果不是,则输出空格;
最后换行;
end for
虽然是一次通过,那是因为刚刚看完超星的视频,可是当我自己再去打一遍时,仍然发现了问题,在vs里,如果没有再定义一个ch1,直接把表达式放到printf,那样是输出不了东西的,因为里面有函数,所以需要在外面在定义一个变量,同时,自己打的时候忘记了换行。
1.我们思考的方式不同,同学的代码是在每十分钟时,如果条件允许,对乌龟的路程加上90,时间加上30。
2.她的代码设计的变量更少,并且其实更容易被人理解,不用绕比较远的路,更加直接。
error input!
1.在读入二进制数时,我们通常想的是把数一个一个从末尾取出来,或者定义一个大的数组用数组存取来,但是同学的代码用getchar()尽管是从头开始存储,但是下面的num=num*2+ch-‘0‘可以直接转为十进制,不用考虑从后面还是前面取。
2.我觉得同学的代码更简单方便,并且效率也会比我的高,因为我用了pow()函数,我觉得这种代码应该是我要学习的。
原文:https://www.cnblogs.com/-sushi/p/11707959.html