0%

循环的例子

循环的例子。

一些习题

编程难在哪

想问题,难在怎么把问题变成程序,怎么去处理,在这个程序中可能遇到的一些,细微小的情况。


例题 log2x

题目:算二的几次方

log2x 的意思就是求 x 是 2 的多少次幂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
int x;
int ret = 0;

scanf("%d",&x);
int t=x;

while( x > 1 ){
x/= 2;
ret ++;
}
printf("log2 of %d is %d.",t, ret);

return 0;
}

9 行 作用是:

x 是循环里计算完剩下的值,如果在后面应用,x 值只会是 1

计算之前先保存原始的值,后面可能有用


因为是算log2x ,所以log2x 0 次方 是 1,所以最小需要比 1 大 。

如果 写成 while ( x >= 2 ),也是一致的

如果 写成 while ( x > 2 ),这个 x=2 循环不会进去,如果要让 x =2,不进入循环,并且结果 ret 能得到 1 ,修改初始值为 1,但如果ret初始值为 1,那么 x=1 的情况,就不对了,应该ret = 0;如果要兼顾这两种情况,所以 x > 1.

如果 让 x > 0; 0 是不可能成为幂值,这个循环还能对,如果 x = 1进去,比 0 大,会去 /2,变成了 0,但是 ret 会进行 一次++ ,成为了 1 ,算log2x,所以答案错误。所以把 ret = -1 ;

如果 x = 1;

x ret
1 -1
0 0

如果 x = 2;

x ret
2 -1
1 0
0 1

所以,改为 x > 0 , ret = -1 ,也是对的

所以题目没有标准答案,只有这个标准答案是对的,这是不可能的,也对于编程来说,肯定有很多不同的方法,只有最优化的办法,令人能看得懂,运行速度,占内存。


计数循环

1
2
3
4
5
6
int count =100;
while ( count >=0 ) {
count --;
printf("%d\n",count);
}
printf("发射!\n");
  • 这个循环需要执行多少次?
  • 循环停下来的伤害,有没有输出最后的0?
  • 循环结束后,count的值是多少?

小套路:如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后作出判断。

例如用3去测试:

1
2
3
4
5
6
7
8
9
int n = 3;

while (n >= 0 ) {
printf("%d", n);
n--;
}
printf("发射\n");

return 0;

n = 3 时,循环走了四轮

n 输出
3 3
2 2
1 1
0 0
-1
  • 这个循环需要执行 101 次
  • 有输出最后的0
  • count 值 = -1

但如果 n– 在printf(“%d”, n); 上面,结果又会是另一种情况

n--;

printf("%d", n);

n 输出
3 2
2 1
1 0
0 -1
-1

第一个输出值和最后一个改变了

没有选择哪一个的问题,看程序要求怎样,是最后要有-1输出还是没有,去有效的调整。

猜数游戏

让计算机来想一个数,然后让用户来猜。用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉用户猜了多少次。

思路:

  • 因为需要不断重复让用户猜,所以需要用到循环
  • 在实际写出程序之前,我们可以先用文字描述程序的思路。
  • 核心重点是循环的条件
  • 人们往往会考虑循环终止的条件
  1. 计算机随机想一个数,记在变量number里;
  2. 一个负责记次数的变量count初始化为0
  3. 让用户输入一个数字a;
  4. count递增(加一);
  5. 判断a和number的大小关系,如果a大,就输出“大”;如果a小就输出“小”;
  6. 如果anumber是不相等的(无论大还是小),程序转回到第3步;
  7. 否则,程序输出“猜中”和次数,然后结束。

循环条件是a和number不相等。

随机数

  • 每次召唤rand()就得到一个随机的整数。

要使用rand 还需要一些条件

1
2
3
4
5
#include<stdlib.h>

#include<time.h>

srand(time(0));

取余

%100

x % n 的结果是[0,n-1]的一个整数

1
2
3
4
5
6
7
8
9
#include<stdlib.h>

#include<time.h>

srand(time(0));

int a = rand();

printf("%d\n",a%100)

这样取余,最后结果就只会取一百以内的数,随机产生一百以内的数

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h> 
#include <stdlib.h>
#include <time.h>

int main()
{
srand(time(0));
int number = rand()%100+1;
int count = 0;
int a = 0;
printf("我已经想好了一个1到100之间的数。");
do{
printf("请猜这个1到100之间数:");
scanf("%d",&a);
count ++;
if (a > number ){
printf("你猜的数大了。");
}else if(a < number){
printf("你猜的数小了。");
}
}while (a != number);
printf("太好了,你用了%d次就猜到了答案。\n",count);

return 0;
}

结果:

image-20201213144110544