一、循环(数一个数字它是几位数)
#include <stdio.h>
int main()
{
int n=0;
int number;
scanf("%d",&number);
n++;
number/=10;
while (number>0){
n++;
number/=10;
}
printf("%d",n);
return 0;
}
如果没有外面的运算,结果会咋样呢?可以自己在纸上写上各个变量的值,随着程序往下走,而不断改变变量的值。一开始我写了几个数试了试都可以,然后我就以为这个程序比第一个更简单,但是忽略了0的存在(当然了题目说的是正整数不包含0,但是第一个式子更具有一般性)
如果把这个语句放在里面,那么对于0来说实现不了目的,当然题目说的是正整数不包含0,但是作为扩展来说的话,把这个式子放在外面更好。
也可以在里面加一个if的判断语句,对x=0这种情况单独拿出来。
二、do-while循环
三、猜数游戏
计算机要随机生成一个数,这个数需要一个变量来接收。
统计一共数了多少次也需要一个变量,并且这个变量的初始值是0。
然后用户需要输入一个变量,所以一共三个变量需要进行初始化。
个人感觉do-while循环不太好用,完全可以转变为外面的几行代码加while循环,这样感觉更好理解,下面自己敲一下
#include <stdio.h>
int main(){
srand(time(0));
int number=rand()%100+1; //因为要生成1到100之间的数
int count=0;
int a=0;
printf("请输入你要猜的数\n");
scanf("%d",&a);
while(a!=number){
if(a>number){
printf("你输入的大了");
count++;
scanf("%d",&a);
}else{
printf("你输入的小了");
count++;
scanf("%d",&a);
}
if(a==number){
if(count==0){
printf("恭喜你第一次就猜对了");
}else{
printf("恭喜你第%d次猜对了",count+1);
}
}
}
return 0;
}
为啥我自己写的这么麻烦 ,而且count为啥要加一?
四、算平均数
#include <stdio.h>
int main()
{
int count=0;
int number;
int sum=0;
scanf("%d",&number);
while(number!=-1){
count++;
sum+=number;
scanf("%d",&number);
}
printf("%f",sum*1.0/count);
return 0;
}
五、整数求逆 (不知道这个整数是几位数)
第一步进行%10运算,先得到它最后一位的数字,然后再进行/10运算,去掉最后一位的数字。以此类推
#include <stdio.h>
int main()
{
int x,a;
int num=0;
scanf("%d",&x);
while(x>0){
a=x%10;
num=num*10+a;
x/=10;
}
printf("%d",num);
return 0;
}
第12行的意思是取出来给定整数的尾数
然后第14行的意思是把尾数向前进一位,并且加上新的尾数(比如把8变成80,然后再加某个数)
第16行的意思是把取出来的尾数去掉,从而进入下一步循环。
但是对于700这种以0结尾的数,最后的输出结果会是7,而不是007,这是因为第14行,0*10之后结果仍然0。
那么我们怎么输出007呢?只需要把700进行倒序,然后挨个printf(),同时注意在printf()里面不要加换行符。 (第9和14行没用,不用看)
#include <stdio.h>
int main()
{
int x,a;
scanf("%d",&x);
while(x>0){
a=x%10;
printf("%d",a);
x/=10;
}
return 0;
}
六、for循环求阶乘
i等于1是初始条件(也可以令i不等于外面初始化所规定的数值,对i进行重新赋值),i<=n是循环继续的条件,i++是每一轮循环要进行的事
自己敲一下(困死了,中午觉着早上起的早就没睡觉,后悔了,现在一直打哈欠,真困死了。)
第一次写的,写错了(前后差距在第六行),忘记对i进行初始化了,以为在括号里写了i=1就不用初始化了。
#include <stdio.h>
int main()
{
int n;
int fact=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
fact*=i;
}
printf("%d",fact);
return 0;
}
#include <stdio.h>
int main()
{
int n;
int fact=1;
int i=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
fact*=i;
}
printf("%d",fact);
return 0;
}
或者这样也行,因为i只在循环里面用到了,在循环外面没有用到,所以我们直接把关于i的初始化语句放到for循环的括号里面就可以了
但是弄完发现报错了
因为这样写只能在C99里面用。
我们发现上面所写的代码实际上执行为1*1*2*3*.........,所以实际上多进行了一步1*1,所以要考虑怎么简化掉那一步
#include <stdio.h>
int main()
{
int n;
int i=2; //这里定义i等于1也可以,因为for循环里面对i进行重新赋值了
int fact=1;
scanf("%d",&n);
for(i=2;i<=n;i++){
fact*=i;
}
printf("%d",fact);
return 0;
}
只需要将i的初始值从1变成2即可,即使输入的n等于1,导致n不会进入for循环,但是最后的结果仍然是1。
#include <stdio.h>
int main()
{
int n;
int i;
int fact=1;
scanf("%d",&n);
for(i=n;i>1;i--){
fact*=i;
}
printf("%d",fact);
return 0;
}
这样写也行,就是把for循环语句里面的i=n省略了,直接对n的值进行递减
至于为什么前面初始化的时候还要引入i这个变量,是因为n通过for循环之后,n的值已经变成了1,printf()里面的内容将会是1!=什么什么,而不是n!=什么什么
#include <stdio.h>
int main()
{
int n;
int i=n;
int fact=1;
scanf("%d",&n);
for(;n>1;n--){
fact*=n;
}
printf("%d",fact);
return 0;
}
注意for循环括号里面的语句,即使第一句不需要再写了,但是;仍然不能省略。
或者写成这样
for(n;n>1;n--){
七、for循环和while循环的选择
但是注意for()里面的表达式可以省略,但是;不能省略。
八、如何利用for或者while循环判断一个数是不是素数?
1不是素数
我们只需判断一个数能不能被除了1和他本身以外的数整除即可。所以可以一个个遍历这些数(从2到x-1)
或者下面这种做法,但是这种做法有一个缺点就是会判断为1也是素数,所以我们可以在最后面再加一句,
九、循环的嵌套
现在考虑一下怎么输出前五十个素数?
或者这样也可以:
如果我们想要让他在找到一个结果之后就直接跳出循环,那么我们应该怎么做呢?
十、前n项求和
注意必须是1.0/i,因为如果是1/i的话,那么无论n等于几,ret的值将始终为1,因为俩整数相除结果一定为整数,并且由于i是大于等于1的,所以结论易知。
并且由于是1.0/i,那么ret一定就不是int类型了,所以初始化时应该是 double ret=0.0 ;
但是这个为啥不对啊?
#include <stdio.h>
int main()
{
double sum=0.0;
int n;
scanf("%d",&n);
for(;n>0;n--){
sum+=1.0/n;
}
printf("%d",sum);
}
十一、整数分解(就听了第一个方法,后面的都没听)
我们看目录中的大标题五 ,这个题目和那个题目有点类似。
我们只需要先对给定的整数进行逆序输出,然后再从尾到头把数字拿出来就行了,很简单。
下面的第16行之所以要让x=t,是因为此时已经跳出了循环,所以x=0,要对x进行重新赋值(通过第15行可以看出来)
注意第19行printf(“%d”,d)的括号里面%d后面是没有空格的。如果有空格的话会令5后面多一个空格。
第20行和第21行是想要去掉1 3 4 2 5中5后面的空格。
或者也可以不重新赋值,直接把t拿过来用也是可以的。
f
这个我们发现当输入700的时候,输出的是7,这是由于结尾0的存在所导致的,所以一开始我想到了用这种方法(之前在标题五提到过的)
#include <stdio.h>
int main()
{
int x,d;
scanf("%d",&x);
int t=0;
while(x>0){
d=x%10;
printf("%d",d);//输出x的倒序数字
x/10;
}
while
return 0;
}
但是我一开始想当然的以为可以这么做,但是敲着敲着就发现这种方法根本行不通,因为我虽然能够解决前导0的问题,但是输出的这个数字没法用变量去接收,因为我是把一个整数分解成一个个数字来输出的,所以我没法用一个变量来接收倒序输出后的整数,也就没法进行下一步运算。
十二、c语言有哪些基础数据类型,sizeof可以用来做什么?
在定义变量的值的时候必须要指明变量的类型,不能直接赋值
c语言一共有这五种数据类型,其中逻辑类型也可以归结到整数类型里面去。
不同的数据类型,所占用的内存大小是不同的
sizeof()给出某个类型或者变量在内存中所占据的字节数,如果sizeo()括号里面的是某个变量的值而不是数据类型的话,它会判断这个值是属于哪一种数据类型,然后根据这一数据类型所占的字节数输出结果。
不要在sizeof的括号里做运算(如果做了运算并不会报错,做不做运算都不会改变变量的值,但是会影响sizeof的结果,sizeof并不会真的去做运算)
a++之后,a仍然是整数,所以sizeof的结果不变。同时由于a++是在sizeof()括号里面做的运算,所以a的值并不会改变,仍然是6
a+1.0之后,数据类型发生了变化,变成了double,所以sizeof()的结果发生了改变,但是变量的值是不变的。
十三、整数类型有多少种
double和float,它们是什么,如何输入输出?