关于“循环“与“分支“的经典例题分享

1.打印3的倍数的数

(1)最基本的方法

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int a = 3;
	while (a <= 100)//通过while循环遍历出1到100之间的所有数字。
	{	
		if (a % 3 == 0)// a模3如果等于0,那说明就是3的倍数。
		{
			printf("%d ", a);
		}
		a++;
	}
	return 0;
}

(2)对(1)进行优化:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int a = 0;//此处是对a进行初始化。
	for (a = 3; a <= 100; a += 3)//运用for循环,在3的基础上不断加3,永远是3的倍数。
	{
		printf("%d ",a);
	}
	
	
	return 0;
}

(题目的解析都在代码的注释里面哦~)

2.从大到小输出

(1)(通过创建临时变量tmp来进行两个数之间的交换)

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int tmp = 0;//在这里为什么要创建一个临时变量?
	printf("请输入三个整数:");
	scanf("%d %d %d", &a, &b, &c);
	if (a < b)
	{
		tmp = a;//创建一个临时变量的原因很简单,你要对两个比较之后的数据进行实质上的交换。
		a = b;//如果不创建临时变量,会导致数据丢失。
		b = tmp;//比如,如果a=2,b=7的话,你仅简简单单的:a=b;这样再往后做的话,就会导致a的数据丢失。
	}				//现在可好a等于7了,那a原来的值就不见了。所以说要创建一个临时变量,也就是比喻中的空瓶子,来进行数据的实质性的交换。
	if (a < c)
	{
		tmp = a;
		a = c;
		c = tmp;
	}
	if (b < c)
	{
		tmp = b;
		b = c;
		c = tmp;
	}
	printf("%d %d %d\n", a, b, c);//从这一行代码可以看出,我直接固定了三个整数从大到小顺序就是a,b,c
	return 0;
}

(2)举一反三:小乐乐获得4个最大数,请帮他编程找到最大的数。

小乐乐找最大数_牛客题霸_牛客网

#include <stdio.h>
//小乐乐获得4个最大数,请帮他编程找到最大的数。
int main()
{
	int a, b, c, d;
	int tmp = 0;

	scanf("%d %d %d %d", &a, &b, &c, &d);
	if (a < b)
	{
		tmp = a;
		a = b;
		b = tmp;
	}
	if (a < c)
	{
		tmp = a;
		a = c;
		c = tmp;
	}
	if (a < d)
	{
		tmp = a;
		a = d;
		d = tmp;
	}
	printf("%d\n", a);
	return 0;
}

 

3.打印素数(打印100~200之间的素数)

首先要明白什么是素数·?

素数就是质数,有无限个。除了1和该数本身以外不再有其他的因数的数被称为素数

(1)试除法:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>//试除法!!!
#include <math.h>
int main()
{
	int i = 0;
	int n = 0;
	int count = 0;//标记素数的个数
	for (i = 100; i <= 200; i++)
	{
		int flag = 1;//这里的flag为什么要放到内循环之前?因为每次被除数被更换的时候,先假设他是一个素数。
		for (n = 2; n <= i-1; n++)//当外层循环确定一个数i之后,内存循环n一直从2累加到i-1,来当做除数被i除
		{
			if (i % n == 0)
			{
				flag = 0;
				break;//如果能被整除,那么就跳出内层循环。这时flag被赋值为零,直接不用打印了,他不是素数。
			}
	
		}
		if (flag == 1)//这个条件判断必须在内循环之后,因为如果它不进入内循环的if条件判断,flag不被赋值为零的时候,可以进行打印素数。
		{
			printf("%d\n", i);
			count++;
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}

(这种是打印素数,最基本的思想方法:试除法)

解析,很详细,在代码中一定要仔细看。

(2)试除法 优化:

很显然,我们知道除了2之外,所有的偶数都不是素数。这样我们就可以在外层循环中把所有的偶数去掉,这样效率就会成半的增加。

#include <stdio.h>//试除法!!!
int main()
{
	int i = 0;
	int n = 0;
	int count = 0;//标记素数的个数
	for (i = 101; i <= 200; i+=2)//此处判断条件直接初始化将a赋值101,i+=2意思是除去所有偶数:因为他肯定不是素数。
	{
		//int n = 0;
		int flag = 1;//这里的flag为什么要放到内循环之前?因为每次被除数被更换的时候,先假设他是一个素数。
		for (n = 2; n <=i-1 ; n++)//当外层循环确定一个数i之后,内存循环n一直从2累加到i-1,来当做除数被i除
		{
			if (i % n == 0)
			{
				flag = 0;
				break;//如果能被整除,那么就跳出内层循环。这时flag被赋值为零,直接不用打印了,他不是素数。
			}

		}
		if (flag == 1)//这个条件判断必须在内循环之后,因为如果它不进入内循环的if条件判断,flag不被赋值为零的时候,可以进行打印素数。
		{
			printf("%d\n", i);
			count++;
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}

(3)终极方法:数学法(效率指数倍的提升)

区别就在于内层循环的条件判断:


int main()
{
	int i = 0;
	int j = 0;
	int count = 0;//标记素数的个数
	for (i = 101; i <= 200; i += 2)//此处判断条件直接初始化将a赋值101,i+=2意思是除去所有偶数:因为他肯定不是素数。
	{
		int flag = 1;//这里的flag为什么要放到内循环之前?因为每次被除数被更换的时候,先假设他是一个素数。
		for (j = 2; j <= sqrt(i); j++)//这里的解析,见我下图列的图片。
		{
			if (i % j == 0)//当外层循环确定一个数i之后,内存循环j一直从2累加到i-1,来当做除数被i除
			{
				flag = 0;
				break;//如果能被整除,那么就跳出内层循环。这时flag被赋值为零,直接不用打印了,他不是素数。
			}
		}
		if (flag == 1)//这个条件判断必须在内循环之后,因为如果它不进入内循环的if条件判断,flag不被赋值为零的时候,可以进行打印素数。
		{
			printf("%d\n", i);
			count++;
		}
	}printf("\ncount=%d\n", count);
	return 0;
}

 其实求解素数的方法有很多种,想要深入研究,请参考《求解素数的n种境界》

4.打印闰年(打印1000年到2000年之间的闰年)

首先你要明白什么是闰年。闰年,实际上不是你想象中的4年一闰都是闰年

标准答案:.闰年的计算,归结起来就是通常说的:四年一闰,百年不闰,四百再闰。

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 1000; i <= 2000; i++)
	{
		if (i % 4 == 0 && i % 100 != 0)//或者这里直接模上400
		{
			printf("%d ", i);
		}
	}
	return 0;
}

5.最大公约数

在这里我介绍两种方法,第1种是暴力枚举法,第2种是辗转相除法。

(1)暴力枚举法:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()//暴力枚举法
{
	int a = 0;
	int b = 0;
	int min = 0;//因为要求最大公约数,所以我们把要输入的那两个数的最小值当做:除数。
	printf("请输入你想要求的两个数的最大公约数:");
	scanf("%d %d", &a, &b);
	if (a > b)
	{
		min = b;
	}
	if (a < b)
	{
		min = a;
	
	}
	while (1)
	{
		if (a % min == 0&&b%min==0)//在这里最大公约数的意思就是,这个除数要满足同时被两个数整除。
		{
			printf("最大公约数是:%d\n", min);
			break;
		}
		else
		{
			min--;//这就是暴力枚举法:在较小的那个数上依次往下减,一直减到能够被你输入的那两个数整除为止,才会找到最大公约数。
		}
	}
	return 0;
}

(2)对 暴力枚举法 的部分进行优化:


#include <stdio.h>
int main()//暴力枚举法
{
	int a = 0;
	int b = 0;
	int min = (a>b?b:a);//在这里我们对上述方法进行改进,运用了三目操作符来确定两个数中的较小值。
	printf("请输入你想要求的两个数的最大公约数:");//(因为要求最大公约数,所以我们把要输入的那两个数的最小值当做:除数。)
	scanf("%d %d", &a, &b);

	while (1)
	{
		if (a % min == 0 && b % min == 0)//在这里最大公约数的意思就是,这个除数要满足同时被两个数整除。
		{
			printf("最大公约数是:%d\n", min);
			break;
		}
		else
		{
			min--;//这就是暴力枚举法:在较小的那个数上依次往下减,一直减到能够被你输入的那两个数整除为止,才会找到最大公约数。
		}
	}
	return 0;
}

(3)求最大公约数的最棒的办法:辗转相除法!!!

#include <stdio.h>
int main()//辗转相除法!!!!辗转相除法,求最大公约数,非常快。
{
	int m = 0;
	int n = 0;
	int k = 0;
	printf("请输入你想要求的两个数的最大公约数:");//(因为要求最大公约数,所以我们把要输入的那两个数的最小值当做:除数。)
	scanf("%d %d", &m, &n);
	while (k = m % n)//如果m模n的值为0,那么就是为假,不进入循环.如果是非零,那么继续循环,继续寻找最大公约数。
	{
		m = n;
		n = k;//解析见下图。
	}
	printf("最大公约数是:%d\n", n);
	return 0;
}

这里我们做一张图片来进行分析:

 自己需要多想想,多练练就会了,加油!!!

6.求10 个整数中最大值


#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int arr[] = { -1,-2,-3,-4,-5,6,-7,-8,-9,10 };
	int i = 0;
	int max = arr[0];//在这里我们假设下标为0,也就是数组中的第1个数为最大值
	for (i = 0; i <= 10; i++)
	{
		if (arr[i] > max)//建立一个for循环,让我们假设的这个数依次与数组中剩余的数作比较
		{
			max = arr[i];//如果数组中有其他数大于我们假设的那个数,我们就把最大值赋给max
		}
	}printf("%d\n", max);
	return 0;
}

解析在代码的注释中仔细看一下

7.分数求和(计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果)

简单分析一下,这个所求的表达式:分子都是1,分母:偶数为负,奇数为正。

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int i = 0;
	double sum = 0;
	for (i = 1; i <= 100; i++)//建立一个for循环遍历分母中从1~100的数字。
	{	//下面的这个if和else相当于数学中的  数列 分组求和 负的在一起,正在一起。
		if (i%2==0)//判断分母是否为偶数。
		{
			sum = sum - (1.0 / i);//因为分母是偶数,所以所有负数集中if这个大框架中。
		}
		else
		{
			sum = sum + (1.0 / i);//因为分母是奇数,所以所有的正数集中在这个else的大框架中。
		}
	}printf("%lf\n", sum);//最终打印出sum是我们所求的值。
	return 0;
}

(解析在图片代码中的注释里认真看一下,应该能看懂的)

8.编写程序数一下 1到 100 的所有整数中出现多少个数字9

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int i = 0;
	int res = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 10 == 9)
		{
			res = i;
			printf("%d\n", res);
		}//这是90之前所有出现9的数字。
		else if (i >= 90 && i <= 99)
		{
			res = i;
			printf("%d\n", res);
		}//这是打印90~99之间的数字。
	}
	
	return 0;
}

(同样解析,在代码的注释里,可以仔细看一下哟)

9.二分查找(前提必须是:序数数组)

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int k = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int flag = 0;
	int left = 0;
	int right = (sizeof(arr) / sizeof(arr[0])) - 1;//这里的left和right都是指的数组的下标。
	int mid = (left + right) / 2;
	printf("请输入你想要查找的数字:");
	scanf("%d", &k);
	while (left <= right)
	{
		if (k > arr[mid])
		{
			left = mid + 1;
			mid = (left + right) / 2;//及时更新mid,重新确定下标,不断的缩小范围进行查找。
		}
		else if (k < arr[mid])
		{
			right = mid - 1;
			mid = (left + right) / 2;//及时更新mid,重新确定下标,不断的缩小范围进行查找。
		}
		else if (k == arr[mid])
		{
			printf("找到了,在数组中的下标为:%d\n", mid);
			flag = 1;

			break;//及时跳出循环,
		}
	}
		if (flag == 0)
		{
			printf("找不到了!\n");
		}
	
	return 0;
}

(二分查找是重中之重的思想,一定要学会。解析,在代码的注释里)

10.n的阶乘

基本思想:还是循环,for循环。

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int res = 1;

	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		res *= i;
	}
	printf("%d\n", res);
	return 0;
}

11.前n个阶乘之和

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int res = 1;
	int sum = 0;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		res *= i;
		sum += res;//这一步是整个程序的精华!在求前(n-1)个阶乘之后加上n。
	}
	printf("%d\n", sum);
	return 0;
}

(解析在代码的注释里)

12.打印九九乘法口诀表

运用两次for循环,第1个控制第1个因子,第2个控制第2个因子。

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int i = 1;
	int j = 1;
	int res = 0;
	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			
			printf("%d*%d=%2d ",j,i,j*i);
		}
		printf("\n");
	}
	return 0;
}

13.请输入密码(用循环)

初识 strcmp=string compare.(用来比较两个字符串大小的函数)

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>//假设密码是123456
#include <string.h>
int main()
{
	int i = 0;
	char password[20] = {0};//数组一定要初始化好,比如说你这个[]里面没有填20的话,你默认只输入一个0,那说明数字中就一个0的内存。
	
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);
		//两个字符串比较相等是不能使用==的,应该使用strcmp库函数
		//strcmp返回0表示2个字符串相等
		//strcmp返回>0的数字,表示第一个字符串大于第二个字符串
		//strcmp返回<0的数字,表示第一个字符串小于第二个字符串
		if (strcmp(password,"123456") == 0)
		{
			printf("登陆成功!\n");
			break;
		}
		else
		{
			printf("密码错误:");
		}
	}
	if (3 == i)//判断条件表示,如果你输入次数等于三次直接退出程序。
	{
		printf("退出程序!\n");
	}
	return 0;
}

14.演示字符从两端向中间汇聚

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include <windows.h>
int main()
{
	char ch1[] = "welcome to bite!!!!!!!!!!";
	char ch2[] = "#########################";
	int left = 0;
	int right = (sizeof(ch1) / sizeof(ch1[0])) - 1;//通过计算数组个数来确定数组最右端元素的下标。
	while (left <= right)
	{
		ch2[left] = ch1[left];
		ch2[right] = ch1[right];
		Sleep(1000);//睡眠函数单位是毫秒
		system("cls");//系统函数清空控制版面上的所有内容:cls
		printf("%s\n", ch2);
		left++;
		right--;//用来控制字符,挨个的往中间汇聚。
	}


	return 0;
}

解析在代码中仔细看一下哟

15.小乐乐求和_牛客题霸_牛客网


#include <stdio.h>

int main()
{
    long long i = 0;
    long long ret = 0;//数据要用long long类型,避免输入的数字过大而导致数据溢出。
    long long n = 0;//总体思想就是不断累加求和的过程。
    
    scanf("%lld", &n);
    for (i = 1; i <= n; i++)
    {
        ret += i;
    }
    printf("%lld\n", ret);
    return 0;
}

16.判断是不是字母_牛客题霸_牛客网

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	char a = 0;
	while ((a = getchar()) != EOF)//EOF= End of file.文件结束的标志,实际上它返回值是-1。
	{//通过运用while循环来实现多组输入。
		if ('a' <= a && a <= 'z' || 'A' <= a && a <= 'Z')
		{
			printf("%c is an alphabet.\n", a);
		}
		else
		{
			printf("%c is not an alphabet.\n", a);
		}
		getchar();// getchar函数是从 输入缓冲区 中获取一个字符
	}
	
	return 0;
}

(题目的解析在代码的注释中)

17.网购_牛客题霸_牛客网

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>

int main()
{
    double price = 0;
    int month = 0;
    int day = 0;
    int y = 0;
    float ret = 0;
    scanf("%lf", &price);
    scanf("%d %d", &month, &day);
    scanf("%d", &y);
    if (month == 11 && day == 11 || month == 12 && day == 12)
    {
  
        if (month == 11 && day == 11)
        {
            if (1 == y)
            {
                ret = price * 0.7 - 50;
            }
            else
            {
                ret = price * 0.7;
            }
        }
        else
        {
            if (1 == y)
            {
                ret = price * 0.8 - 50;
            }
            else
            {
                ret = price * 0.8;
            }
        }

    }
    if (ret < 0)//这个地方的条件判断就是题目中所说的,不可能让商家倒找钱。
    {
        ret = 0;
    }
    printf("%.2f\n", ret);//打印结果必须保留两位小数。

    return 0;
}

(题目的解析在代码的注释中)

好了,今天的题目分享就到这里了,如果觉得对大家有帮助的话,可以给博主一个点赞和关注嘛,你们对我的支持,是我继续往下创作的最大动力哦!

 

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小能软糖_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值