C语言基础:分支与循环

目录

易错点与注意点

小练习

实现1!+2!+3!+....+n!

在有序数组中,用二分法查找某一个数

演示多个字符从两端移动,向中间汇聚

>>>sleep函数

>>>system函数

求两个数的最大公约数

打印1000-2000之间的闰年

打印100-200之间的素数


易错点与注意点

#include<stdio.h>
int main()
{
	int age = 40;
	if (age < 18)
	{
		printf("少年\n");
	}
	//错误:判断条件不能直接写"18 <= age <30"
	else if (18 <= age <30)  
	{
		printf("青年\n");
	}
	return 0;
}
//代码1与代码2本质一样
	
	//代码1
	if (true)
	{
		return 1;
	}
	return -1;
	//代码2
	if (true)
	{
		return 1;
	}
	else
	{
		return -1;
	}
#include<stdio.h>
int main()
{
	int i = 0;
	while (i <= 10)
	{
		if (5 == i)
		{
			continue;
		}
		printf("%d ", i);
		i++;
	}
	return 0;
}
//运行结果:0 1 2 3 4 之后进入死循环
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for ( ; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("hello\n");
		}
	}
	return 0;
}
//运行结果:打印3个 hello
#include <stdio.h>
int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hello\n");
	}
	return 0;
}
//运行结果:打印2个 hello

//下面代码中循环要循环几次?  0次
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0, j = 0; j = 0; i++, j++)
	{
		j++;
	}
	return 0;
}

小练习

实现1!+2!+3!+....+n!

//实现n!
#include <stdio.h>
int main()
{
	int n = 0;
	int result = 1;
	printf("请输入n的值:\n");
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		result *= i;
	}
	printf("n的阶乘是:%d", result);
	return 0;
}

//实现1!+2!+3!+....+n!
#include <stdio.h>
int main()
{
	int n = 0;
	int result = 1, sum = 0;
	printf("请输入n的值:\n");
	scanf("%d", &n);
	for (int j = 1; j <= n; j++)  //外循环:1 2 3....
	{
		result = 1;  //每次阶乘前一定要初始化
		for (int i = 1; i <= j; i++)  //内循环:1! 2! 3!...
		{
			result *= i;
		}
		sum += result;
	}
	printf("n的阶乘是:%d\n", result);
	printf("n的各项阶乘的和是:%d\n", sum);
	return 0;
}


//实现1!+2!+3!+....+n!---改进版
#include <stdio.h>
int main()
{
	int n = 0;
	int result = 1, sum = 0;
	printf("请输入n的值:\n");
	scanf("%d", &n);
	for (int j = 1; j <= n; j++)  
	{
		result *= j;
		sum += result;
	}
	printf("n的阶乘是 %d \n", result);
	printf("n的各项阶乘的和是 %d \n", sum);
	return 0;
}

在有序数组中,用二分法查找某一个数

//在有序数组中,用二分法查找某一个数
//错误代码
#include <stdio.h>
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int num = 5;
	int len = sizeof(arr) / sizeof(arr[1]);
	int i = (len - 1) / 2;
	while (1)
	{
		if (arr[i] > num)
		{
			i = i / 2;
		}
		else if (arr[i] < num)
		{
			//i = i + (len - i) / 2;   //这种写法6找不到,死循环
			i = i + (len - 1 - i) / 2;  //这种写法10找不到,死循环
		}
		else
		{
			break;
		}
	}
	printf("下标是: %d", i);
	return 0;
}


//正确代码
#include <stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int num = 10;
	int len = sizeof(arr) / sizeof(arr[0]);
	int left = 0, right = (len - 1);
	int mid = (left + right) / 2;
	while (arr[mid] != num)
	{
		if (arr[mid] > num)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
		mid = (left + right) / 2;
	}
	printf("下标是:%d", mid);
	return 0;
}

演示多个字符从两端移动,向中间汇聚

//演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
int main()
{
	char str1[] = "I am handsome!!";
	char str2[] = "***************";
	int len = strlen(str2);
	int start = 0, end = len - 1;
	while (start <= end)
	{
		str2[start] = str1[start];
		str2[end] = str1[end];
		printf("%s\n", str2);
		start++;
		end--;
		Sleep(1000);
		system("cls"); //清屏
	}
	printf("%s\n", str2);
	return 0;
}

>>>sleep函数

------将进程挂起设定的时长

1.Windows下:

#include <windows.h> 

void Sleep(DWORD dwMilliseconds);  单位:毫秒

2.Linux下:

#include <unistd.h>

unsigned int sleep(unsigned int seconds);  单位:秒 (更精确用usleep,微秒)

>>>system函数

----执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数command为命令名,在windows系统下参数字符串不区分大小写

#include <stdlib.h>

int system(const char * command)

求两个数的最大公约数

//求两个数的最大公约数
#include <stdio.h>
int main()
{
	int m = 0, n = 0;
	printf("请输入两个整数:\n");
	scanf("%d %d", &m, &n);
	//最大公约数不会大于两个数中较小的那个
	int max = m > n ? n : m;  
	while (1)
	{
		if (m%max == 0 && n%max == 0)
		{
			printf("最大公约数是:%d\n", max);
			break;
		}
		max--;
	}
	return 0;
}


//辗转相除法
#include <stdio.h>
int main()
{
	int m = 0, n = 0, t = 0;
	printf("请输入:\n");
	scanf("%d %d", &m, &n);
	while (t = m % n)
	{
		m = n;
		n = t;
	}
	printf("最大公约数是:%d\n", n);
	return 0;
}

打印1000-2000之间的闰年

//打印1000-2000之间的闰年
//能被4整除,不能被100整除 或者 能被400整除
#include <stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 1000; i <= 2000; i++)
	{
		if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n一共%d个闰年\n", count);
	return 0;
}

打印100-200之间的素数

//打印100-200之间的素数
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
				break;
		}
		if (i == j)
		{
			printf("%d ", i);
		}
	}
	return 0;
}


//优化
#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	for (i = 101; i <= 200; i += 2)  //偶数不可能是素数
	{
		int j = 0;
		int flag = 0;
		//假设 s = m * n,则m和n中一定至少有一个数小于等于s开平方
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 1;
				break;
			}
		}
		if (flag == 0)
			printf("%d ", i);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值