在我们的学习过程,难免会遇到许多问题。当我们遇到问题时,无论他简单与否,先试着能不能自己解决它,实在不行再去寻找高人求助。尽量不要遇到问题都还没面对他,就去请大佬把他解决了,这样对我们的学习帮助很小,而且不经过思考就解决的问题,也很难让我们去记住他,以后遇到同样的问题还是要去请大佬。就像你是一位原神萌新,每次打周BOSS的时候都要请其他的满级大佬来帮你打,但是打完之后所有突破材料都被大佬拿走了,你只能混到一点经验值。因此在日常生活中,不管我们遇到的是什么样的问题,我们都应该先去直面它,尽自己最大的力想出该问题的解决方法,这样我们才能触类旁通,事半功倍
以下近期学习C语言时遇到一些有意思的题目,想与大家分享一下
一、寻找素数
1.1 题目:打印100~200之间的素数
此题的思路是先运用for循环生成100~200的数字,再用if语句判断生成的这个数字是否为素数,是则打印,不是就再生成新的素数。
因此这个题目的大体函数框架我们已经构思出来了,只需要再解决最后一个问题:如何判断这个数字是素数?
1.2 分析问题
众所周知:素数只有1和它本身两个因数。
众所又周知:我们要判断这个数n是否为素数只需要生成2~n的数字分别判断他们取余数是否为0,只要出现一个,那么这个数就不是素数,就不能打印出来。
于是聪明的你就可以写出这样的一个代码(自己动手打打去,待会再来对答案)
1.3 代码及答案
int main() {
int i, j, flag;
// 判断一个数是否为素数
for (i = 100; i <= 200; i++) {
flag = 1;
for (j = 2; j < i; j++) {
if (i % j == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
printf("%d ", i);
}
}
return 0;
}
这里因为生成的数字中只要出现一个,那么这个数就不是素数,就不能打印出来,所以程序里面只要找到了一个因数,就直接break跳出循环,可以节省很多程序运行的步骤!!!聪明吧~
最后答案为:
1.4 类似题目
1. 给定两个数,求这两个数的最大公约数
2.输入一个年份,判断输入得年份是否为闰年
不会的可以私信我讨论哈
二、求10个整数中的最大值
2.1 题目:求10个整数中的最大值
这显然需要先让我们输入是个数据进去给程序,程序才能分析并寻找出他的最大值,所以程序大体结构为:先输入,在分析,最后输出。
2.2 分析问题
这里我的思路是先将这些数字按下标排序
将前一个数字和后一个数字进行比较,如果前面的数字大,则这两个数字交换顺序,否则啥也不干,然后这样一直循环下去,直到到最后一个数字
这时,聪明的你就会发现最大的数字已经被换到了最后一个,所以我们只用打印最后一个数字进行
思路清晰就开始打代码!还是先去打好代码再来对答案
2.3 代码及答案
int main()
{
int i = 0;
int r = 0;
int a[10];
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]); //输入是十个数字
}
for (i = 0; i < 9; i++)
{
if (a[i] > a[i + 1])
{
r = a[i];
a[i] = a[i + 1];
a[i + 1] = r;
//把最大值移到最后面
}
}
printf("%d", a[9]);
return 0;
}
运行结果
2.4 类似问题
遇到问题多自己解决!触类旁通!不会的也可以私信我哈
编写程序数一下 1到 100 的所有整数中出现多少个数字9
三、二分法
3.1 编写代码在一个整形有序数组中查找具体的某个数
注意这里是有序的数组,就是要么从大到小排列,要么从小到大排列
3.2 分析问题
这里我们直接用一个循环生成从有序数组的最小值到最大值的数字,一一与其对比,若相等则能找到这个数字,若不等,则找不到这个数字
直接上代码:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int a = 0;
int flg = 0;
printf("请输入要查找的数字:");
scanf("%d", &a);
for (i = 1; i <= 10; i++)
{
if (i == a)
{
flg = 1;
printf("\n找到了,下标是:%d", i-1);
//注意下标与数字对应的关系
break;
}
}
if (0 == flg)
printf("找不到,玩我呢!");
return 0;
}
运行结果自己复制到编译器里去看,我懒得截屏了
逗你玩的
但是!!!!!!!如果这样解决的话,为什么我还要给它单独拿出来讲呢??
所以此题肯定还有去他的解法
首先向大家介绍一个常见的聚会团建小游戏“数字炸弹”
规则如下:
这里1-100数字就是一个有序的数组,实现选好一个数字就是我们要找到的数字,再然后大家随机说数字,不断缩小范围,直到找出那个数字,游戏结束。
而二分法也是同样的方法,只不过每次我们都取中间的那个数字作为参考,再来和我们要找的数字进行对比,缩小空间,如果数字在这个有序数组里面,则找到数字就停止运行,并打印数字,如果数字没有在有序性数组里面,则程序会一直持续运行直到左边的数字和右边的数字都一样或者已经相交才停止运行,并打印“找不到”
所以程序的思路为:(假设从十个数字里面找)
1. 先将最左边的数字下标确定为0,在依次排序到最右边的下标9
2.将两个下标相加后除2得到中间的下标,再用中间这个数与我们的目标进行对比,如果中间这个数比目标大,则最右边的下标变为刚才取的中间的下标-1,反之则最左边的下标变为刚才取的中间的下标+1
3.一直循环步骤2直到找到目标(或找不到)
思路清晰就去打代码啦,记得回来对答案
3.3 代码及答案
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("请输入寻找的数字:\n");
while (scanf("%d", &i) != EOF)
{
int left = 0;
int right = 9;
int mid = 0;
int a = 0;
while (right >= left)
{
mid = (right + left) / 2;
if (arr[mid] == i)
{
printf("找到了,下标为:%d\n", mid);
a = 1;
break;
}
else if (arr[mid] < i)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
if (0 == a)
printf("找不到\n");
}
return 0;
}
需要注意的是,这里我多加了循环while (scanf("%d", &i) != EOF),以便多输入几次数据方便查找,所以我们要把left、right、mid、a这几个变量定义在循环里面,使得每次输入都重新给这些变量赋值
运行结果:
以上就是我近期C语言学习中遇到的一些有趣的问题,欢迎大家来和我一起探讨