C语言100题(1~5)

记录自己做C语言经典100题的训练过程(1~5)

第一题:

有1,2,3,4,4个数字,请问能组成多少个互不相同的三位数?都是多少?
这是我自己想的思路,答案是对的,过程繁琐了些。

#include<stdio.h>
int main(void)
{
	int number[4] = { 1, 2, 3, 4 };//初始数组
	int left_number1[3] = { 0, 0, 0 }, left_number2[2] = {0,0};//第1个数组用于存放被挑选1个数后,初始数组剩余的数被放于第1个数组;第2个数组用于存放再被挑选一个数后,第1个数组剩余的数放于第2个数组
	int i, j,k,t,position,first_number,second_number;//每2个变量用于控制循环,位置变量用于存放数组,两个数字变量用于存放被挑选后的数
	int count=0;//用于计数
	for (i = 0; i < 4; i++)
	{
		position = 0;
		//挑选第1个数后,把剩余的数放于第1个剩余数组
		first_number = number[i];
		for (j = 0; j < 4; j++)
		{
			if (j != i)
			{
				left_number1[position] = number[j];
				position++;
			}
		}
		position = 0;
		//进行第2次挑选
		for (k = 0; k < 3; k++)
		{
			//挑选第2个数字
			second_number = left_number1[k];
			//在挑选第2个数字后,把剩余数字放于第2个剩余数组中
			for (t = 0; t < 3; t++)
			{
				if (t != k)
				{
					left_number2[position] = left_number1[t];
					position++;
				}
			}
			//此时第2个剩余数组选择完毕,第2个剩余数组只有两个数字。此时只需要输出两次即可
			printf("%5d		%5d", (first_number * 100 + second_number * 10 + left_number2[0]), (first_number * 100 + second_number * 10 + left_number2[1]));
			//由于每次打印两个数字,故每次计数+2
			count += 2;
			printf("\n");
		}
	}
	printf("%4d", count);
	return 0;
}

上述我的代码的思路是:自己从已经设置好的数组去选择和挑选。具体的思考过程已经给了注释。
接下来的代码是我看B站上关于这个题的参考解答

	int i, j, k, a[100], n = 0;
	for (i = 1; i <= 4; i++)
	{
		for (j = 1; j <= 4; j++)
		{
			for (k = 1; k <= 4; k++)
			{
				if (i != j&&i != k&&j != k)
				{
					a[n] = i * 100 + j * 10 + k;
					n++;
				}
			}
		}
	}
	printf("能组成%d个无重复数字的三位数\n", n);
	printf("分别是:");
	for (i = 0; i < n; i++)
		printf("%3d", a[i]);
	return 0;

这个参考解答的思路更nice。它是从题目中说的三个不同的数字从发,且3个数字都是处于1~4中。则我只需要让i,j,k分别都从1变化到4,且包含2次for嵌套。再用if条件语句去判断3个数字都不同的条件,只要满足这个条件,就可以输出这个数字。

第二题:

利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万到60万之间时高于40万元的部分,可提成3%;
60万到100万之间时,高于60万元的部分,可提成1.5%;
高于100万元时,超过100万元的部分按1%提成。

解题思路:这一题很容易做,主要考察if和else语句的使用

		double profit,bonus;//定义利润与奖金的变量
		printf("Please enter the profit(W RMB) :");//告诉输入者利润以万元为单位。
		scanf("%lf", &profit);
		if (profit <= 10)
			bonus = profit*0.1;
		else if (profit >= 10 && profit < 20)
			bonus = 10 * 0.1 + (profit - 10)*0.075;
		else if (profit >= 20 && profit < 40)
			bonus = 10 * 0.1 + 10 * 0.75 + (profit - 20)*0.05;
		else if (profit >= 40 && profit < 60)
			bonus = 10 * 0.1 + 10 * 0.75 + 20 * 0.05 + (profit - 40)*0.03;
		else if (profit >= 60 && profit <= 100)
			bonus = 10 * 0.1 + 10 * 0.75 + 20 * 0.05 + 20 * 0.03 + (profit - 60)*0.015;
		else if (profit >100)
			bonus = 10 * 0.1 + 10 * 0.75 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100)*0.01;
		printf("The bonus is %g", bonus);

唯一需要注意的是:如果使用float是可能会丢失,定义为double型是较为合适的。

第三题:

一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

解题思路:首先,肯定需要通过键盘输入一个界限,来找在这个界限范围内合适的数字。其次,通过两次for循环,分别找到满足加100后的数字,再通过下一个for循环,找到在满足加100后还满足加168的数字。

	int x,n,m,number[100];//定义x为我们想要找的那个数,用n去判断加100后的完全平方,用m去判断加168后的平方
	int limit;//手动输入界限去猜这个范围内合理的数字
	int position = 0;//定义位置变量用来存储合适的数字
	printf("Please enter the limit :");
	scanf("%d", &limit);
	for (x = 0; x < limit; x++)
	{
		//这一步是去找经过加100后在界限里面合适的数字
		for (n = 1; n < limit; n++)
		{
			if ((x + 100) == (n*n))
			{
				number[position] = x;
				position++;
			}
		}
	}
	//这一步是去在已经经过筛选的number数组里面去找合适的数字
	for (int i = 0; i< position; i++)
	{
		//用一个for循环是在数组里面用m去找合适的数
		for (m = 1; m <limit; m++)
		{
			if ((number[i] + 268) == (m*m))
				printf("%5d", number[i]);
		}
	}

接下来是B站参考解答的代码,我觉得思路和做第一题一样类似的思路。

	int i, j, k;
	for (i = 0; i <= 1000; i++)
		for (j = 0; j <= 1000; j++)
			for (k = 0; k <= 1000; k++)
				if ((i + 100 == j*j) && (i + 268) == k*k)
					printf("这个数是%d\n", i);

总结下:第1题和第3题B站UP主采用了类似的思路。在第3题中用3个for循环嵌套去找,然后通过与语句共同来判断。但是对比一下,我觉得我的程序运行效率更高些。

第四题:

输入某年某月某日,判断这一天是这一年的第几天?

解题思路:主要考虑闰年,然后主要考察switch语句的使用。这个题还是很容易思考的。但是我在解这个题时犯了一个小失误。我忘记了switch语句是先根据case选择后,如果对应的case语句没有break,才会依次往下执行。我给记成了switch语句,是先从第一个case语句开始,真是犯了低级的失误。

	int year, month, day;//用来输入日,月,天的变量
	int count = 0;//用来计算第多少天的变量
	printf("Please enter year month day :");
	scanf("%d %d %d", &year, &month, &day);
	switch (month)
	{
		case 1:
			count = day;
			break;
		case 2:
			count = day + 31;
			break;
		case 3:
			count = day + 31 +28;
			break;
		case 4:
			count = day + 31*2 + 28;
			break;
		case 5:
			count = day + 31 * 2 + 28+30;
			break;
		case 6:
			count = day + 31 * 3 + 28 + 30;
			break;
		case 7:
			count = day + 31 * 3 + 28 + 30*2;
			break;
		case 8:
			count = day + 31 * 4 + 28 + 30*2;
			break;
		case 9:
			count = day + 31 * 5 + 28 + 30*2;
			break;
		case 10:
			count = day + 31 * 5 + 28 + 30*3;
			break;
		case 11:
			count = day + 31 * 5 + 28 + 30 * 4;
			break;
		case 12:
			count = day + 31 * 5 + 28 + 30 * 5;
			break;
	}
	if (year % 4 == 0)
		count++;
	printf("This %d day is %d year's %dth day", day, year, count);

第五题:

输入三个整数x,y,z,请把这三个数由小到大输出。

解题思路:这个已经是基础题,就是两两比较即可。也可以用for循环采用冒泡排序法也是可以的。

	int x, y, z,temp;
	//进行3次比较即可
	scanf("%d %d %d", &x, &y, &z);
	if (x > y)
	{
		temp = x;
		x = y;
		y = temp;
	}
	if (x > z)
	{
		temp = x;
		x = z;
		z = temp;
	}
	if (y > z)
	{
		temp = y;
		y = z;
		z = temp;
	}
	printf("%d %d %d ", x, y, z);
	return 0;

今天,先写5道题。后面接着更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问 目标检测涉及以下几个核心问: 分类问:判断图像中的目标属于哪个类别。 定位问:确定目标在图像中的具体位置。 大小问:目标可能具有不同的大小。 形状问:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值