例1 如何算一个数log2之后的结果
#include<stdio.h>
int main()
{
int n,t;
int i=1;
scanf("%d",&n);
t=n;
while(n>2){
n/=2;
i++;
}
printf("log2 of %d is %d",t,i);
}
上面的i 和while()里的可以改变吗? 自己试试几次不同的数值 例如 i=1 i=0 i=-1
1】这里是近似值,循环计数除于2的次数
2】t=n 小技巧 留着后面输出
计数循环 相关参数 =0/=1? >1/>=1? 循环了几次 循环最后的值 都要格外注意
模拟运行行可以模拟比较小的次数
例 2
#include<stdio.h>
int main()
{
int count=100;
while(count>=0){
count--;
printf("%d\n",count);
}
printf("发射!\n");
}
1这个循环需要执行多少次?
2循环停下来的时候,有没有输出最后的0?
3循环结束后,count的值是多少?
101 0 -1
如果循环体两句反过来 结果会有变化吗?循环最后输出的那个数是多少?
#include<stdio.h>
int main()
{
int count=100;
while(count>=0){
printf("%d\n",count);
count--;
}
printf("发射!\n");
}
-1 0 所以正确的发射倒计时程序应该是第二个。
例3 算平均数
让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算这些数字的平均数,输出输入数字的个数和平均数
#include<stdio.h>
int main()
{
int n,sum;
int count=0;
scanf("%d",&n);
while(n!=-1){
count++;
sum+=n;
scanf("%d",&n);
}
printf("%d个数的平均数是%f",count,1.0*sum/count);
return 0;
}
例3 补
7-25 求奇数和分数 15
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116
#include<stdio.h>
int main()
{
int i, a;
i=0;
scanf("%d",&a);
while(a>0)
{
if(a%2==1)
{
i=i+a;
}
scanf("%d",&a);
}
printf("%d",i);
return 0;
}
例4
让计算机想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,知道用户猜中为止,最后还要告诉用户他猜了多少次。
问题变成程序 分析
重复猜 要用循环 while 还是do-while 核心重点是循环的条件<循环终止的条件>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0)) ;
int number=rand()%100+1;
int count=0;
int a;
printf("我已经想好了一个1到100的数,请猜出这个数\n");
do{
scanf("%d",&a);
count++;
if(a>number)
{
printf("大了\n");
}else if(a<number)
{
printf("小了\n");
}
}
while(a!=number);
printf("您猜了%d次",count);
return 0;
}
1】随机生成数 rand()
2】想要一个范围 用x%n;取到一个0-n-1范围的数
3】用do-while更合适 pta有更复杂的一道题 慕课入门练习7-23
例5 逆序数 自由给出一个数 输出逆序数(非3位逆序数,考虑循环)
#include<stdio.h>
int main()
{
int n;
int x;
scanf("%d",&n);
while(n>0){
x=n%10;
n/=10;
printf("%d",x);
}
return 0;
}
700 007
换种方式呢
#include<stdio.h>
int main()
{
int n;
int x;
int ret=0;
scanf("%d",&n);
while(n>0){
x=n%10;
n/=10;
ret=ret*10+x;
}
printf("%d",ret);
return 0;
}
细心体会其中的偏差