C语言程序设计-翁恺视频
1、while循环
①求输入数字的位数:
#include <stdio.h>
int main ()
{
int x;
int n=0;
scanf("%d",&x);
n++;
x /= 10;
while ( x> 0 )
{
n++;
x /= 10;
}
printf("%d\n",n);
return 0;
}
②求log2X的值:
#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;
}
2、if else的嵌套
①求三个数的最大值:
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if(a>b)
{
if(a>c)
printf("max=%d",a);
else
printf("max=%d",c);
}
else
{
if(b>c)
printf("max=%d",b);
else
printf("max=%d",c);
}
return 0;
}
②分段函数:
#include <stdio.h>
int main()
{
int x,f;
scanf("%d", &x);
if(x<0)
{
f=-1;
}
else if(x==0)
{
f=0;
}
else
{
f=2.0*x;
}
printf("f(x)= %d\n", f);
return 0;
}
3、switch-case
#include <stdio.h>
int main()
{
int type;
scanf("%d",&type);
switch(type)
{
case 1: printf("你好"); break;
case 2: printf("早上好"); break;
case 3: printf("晚上好"); break;
case 4: printf("再见"); break;
default: printf("啊,什么啊?");
}
return 0;
}
4、猜数游戏
- x%n的结果是[0,n-l]的一个整数
#include <stdio.h>
int main(void)
{
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;
}
5、算平均数
#include <stdio.h>
int main(void)
{
int number;
int sum = 0;
int count = 0;
scanf("%d", &number);
while( number != -1)
{
sum += number;
count ++;
scanf("%d",&number);
}
printf("%f\n", 1.0*sum/count);
return 0;
}
6、整数逆序
①对一个整数做%l0的操作,就得到它的个位数;
②对一个整数做/10的操作,就去掉了它的个位数(整数运算会丢弃小数点后的数字);
③然后再对②的结果做%l0,就得到原来数的十位数了
#include <stdio.h>
int main (void) //700转换为7
{
int x;
int digit;
int ret = 0;
scanf("%d", &x);
while( x>0 )
{
digit = x%10;
ret = ret*10 + digit;
printf("x=%d,digit=%d,ret=%d\n", x, digit, ret);
x /= 10;
}
printf("%d", ret);
return 0;
}
#include <stdio.h>
int main (void) //700转换为007
{
int x;
int digit;
int ret = 0;
scanf("%d", &x);
while( x>0 )
{
digit = x%10;
printf("%d",digit);
ret = ret*10 + digit;
x /= 10;
}
return 0;
}
7、阶乘 for循环
#include <stdio.h>
int main (void) //for循环
{
int n;
int i = 1;
int fact = 1;
scanf("%d",&n);
for ( i=1; i<=n; i++) //for (int i=2; i<=n; i++) 去掉前面的i的声明,再换成这句也是可以的,前提是c99
{ //for (; n>1; n--) { fact *= n;}
fact *= i;
}
printf("%d!=%d\n", n, fact);
return 0;
}
int main(void) //while 循环
{
int n;
int fact = 1;
int i = 1;
scanf("%d", &n);
while ( i <= n)
{
fact *= i;
i++;
}
printf("%d!=%d\n", n, fact);
return 0;
}
8、整数分解

image.png
9、求最大公约数(辗转相除法)
#include <stdio.h>
int main(void)
{
int a, b;
int t;
scanf("%d %d", &a, &b);
while ( b != 0 )
{
t = a%b;
a=b;
b=t;
}
printf("gcd=%d\n",a);
return 0;
}
为何少一个循环
#include <stdio.h>
int main (void)
{
int mask = 1;
int x=70000;
do
{
x /= 10;
mask *=10;
printf("x=%d mask=%d\n", x, mask);
}while ( x > 9 ); //x>0
printf("mask=%d\n", mask);
return 0;
}
10、水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33
本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
#include <stdio.h>
int main (void)
{
int n;
scanf("%d", &n);
//n=3;
int first = 1;
int i =1;
while ( i<n)
{
first *= 10;
i ++;
}
i = first;
while ( i<first*10) // 遍历100-999
{
int t = i;
int sum = 0;
do
{
int d = t%10;
t/=10;
int p = d;
int j = 1; //1到n 循环n-1次和幂次一致,3次方乘2次
while ( j<n )
{
p *=d; //求得每个位置上的幂次方
j++;
}
sum += p;
}while ( t>0);
if (sum == i) //判断幂次和与原数是否一致,一致为水仙花数
{
printf("%d\n", i);
}
i++;
}
return 0;
}
11、本题要求对任意给定的1位正整数N,输出从1*1到N*N的部分口诀表:
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int i,j;
i=1;
while ( i<=n )
{
j=1;
while ( j<=i )
{
printf("%d*%d=%d", j,i,i*j);
if( i*j < 10 )
{
printf(" ");
}
else {
printf(" ");
}
j++;
}
i++;
printf("\n");
}
return 0;
}