9

阶乘、二分查找法及原理--分支循环的简单应用

 2 years ago
source link: https://blog.51cto.com/u_15794567/5767563
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

阶乘、二分查找法及原理--分支循环的简单应用

精选 原创

光轮2000 2022-10-18 16:46:56 ©著作权

文章标签 自增 二分查找法 数组 阶乘 文章分类 C/C++ 编程语言 阅读数195

一、计算n的阶乘

思路分析:想要计算n的阶乘,即1*2*3*...*(n-1)*n,那么不难想到要引入一个自增变量,由自增变量又可以联想到要使用循环实现变量自增,只需要让这个变量每次自增的值相乘即可,这个每次相乘的值需要储存到一个变量中,利用这变量来实现前一次自增和本次相乘的目的,于是代码可以写为

#include <stdio.h>
int main()
{
int i = 1;
int s=1;
int n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s*=i;
printf("%d ",s);
}
return 0;
}

二、计算1!+2!+...+10!

思路分析:思路和上题基本一致,这次需要再引入一个变量用来储存每次的和,于是代码可以写为

#include <stdio.h>
int main()
{
int i = 1;
int sum=0;
int ret=1;
for(i=1;i<=10;i++)
{
ret*=i;
sum+=ret;
printf("%d ",sum);
}
return 0;
}

三(二分查找法)、在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找x

思路分析:题目要求是要在有序数组中查找数字,这里举一个简单的例子,主要引入二分查找法,也叫做折半查找法,这种思想方法很重要。

int arr[]={1,2,3,4,5,6,7,8,9,10};
//下标分别为0,1,2,3,4,5,6,7,8,9
int k = 7;

有这样一个有序数组,我要查找7这个元素,它的下标为6,当然可以一个个访问数组的元素,然后找到你最终想要的元素,但是当基数庞大时,这种方法效率并不高,现在引入一种新的查找方法:二分查找法。顾名思义,二分查找法就是按照你想要的元素将区间一次次等分,最终锁定这个元素的区间,此方法即为二分查找法,查找一次肯定是达不到目的的,所以要使用循环语句,那么循环的判断条件是什么呢?循环的主体又是什么呢?

进一步思考,我在这里引入两个变量,分别是left和right,它们分别代表着左下标和右下标,左下标的初始值为0,在未知数组元素个数的时候右下标的初始值可以为sizeof(arr)/sizeof(arr[0]),引入变量mid代表这两个下标的中间值。

int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
int mid = (left + right)/2;

当我将某个区间分开时,mid会产生一个新的下标,用arr[mid]代表的数跟我要找的元素比较,如果是arr[mid]大,说明目标元素在mid的左边,那么我们可以保持左下标不变,让新的右下标变成mid-1

if(arr[mid]>k)
{
right = mid - 1;
}

那如果是arr[mid]小,说明目标元素在区间的右边,此时我们可以保持右下标不变,让新的左下标变成mid+1

else if(arr[mid]<k)
{
left = mid + 1;
}

如此以来,我们就可以反复执行这个程序,最终锁定区间

else
{
printf("找到了,下标是:%d\n",mid);
}

可是回到刚才的问题上:循环的判断条件是什么呢?该怎么样让它进入循环呢?

有没有这么一种可能,你要查找到这个元素,在这个数组中根本就不存在,当这个区间缩小到可以确定这个元素的时候(如果有这个元素的话),左下标和右下标都已缩小或扩大到到极限,由于该数组中根本就没有这个元素,导致左下标继续往右扩大,右下标继续往左缩小,那么会出现什么情况呢?那就会导致这个程序无法继续往下执行,想到这里,我们就不难想出循环判断的条件了,那就是左下标一定要小于右下标

while(left<right)

当不满足这个循环条件时,跳出循环,打印not found

所以完整的代码为

#include <stdio.h>
int main()
{
int k = 7;
int arr[]={1,2,3,4,5,6,7,8,9,10} ;
int sz = sizeof(arr)/sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]>k)
{
right = mid - 1;
}
else if(arr[mid]<k)
{
left = mid+1;
}
else
{
printf("找到了,下标是:%d\n",mid);
break;
}
}
if(left>right)
{
printf("not found");
}
return 0;
}

Recommend

  • 47
    • www.ydstudio.net 6 years ago
    • Cache

    Java实现二分查找算法

    二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。所以在采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序、冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找。 基本...

  • 52
    • studygolang.com 6 years ago
    • Cache

    数据结构与算法:二分查找

    二分查找是搜索算法中的一种,用来搜索 有序数组 二分查找:...

  • 67

    前言科普 第一篇二分搜索论文是 1946 年发表,然而第一个没有 bug 的二分查找法却是在 1962 年才出现,中间用了 16 年的时间。 2019 年的你,在面试的过程中能手写出没有 bug 的二分查找法么? 定义 在计算机科学中,二分查找(英语:bina

  • 29

    最近忙里偷闲,每天刷一道 LeetCode 的简单题保持手感,发现简单题虽然很容易 AC,但若去了解其所有的解法,也可学习到不少新的知识点,扩展知识的广度。 创作本文的思路来源于:

  • 21
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    二分查找及对应的几道经典题目

    ↑ 点击上方蓝字" 奶糖猫 ",加个关注如何 本文约2500字,阅读大概需要10分钟 二分查找(Binary Search)属于七大查找算法之一,又称折半查找,它的...

  • 29
    • www.cnblogs.com 4 years ago
    • Cache

    二分查找及其变种算法

    目录 前言 概念:二分查找(Binary Search)算法,一种针对有序数据集合的查找算法,也叫折半查找算法。 思想:二分查找针对的是一个 有序的数据集合 ( 升序或降序 ),查找思想有点类似...

  • 10
    • labuladong.github.io 4 years ago
    • Cache

    如何运用二分查找算法

    如何运用二分查找算法 👆让天下没有难刷的算法!若 GitBook 访问太慢,可尝试

  • 17
    • itimetraveler.github.io 4 years ago
    • Cache

    ”二分查找“算法的时间复杂度

    ”二分查找“算法的时间复杂度 算法的时间复杂度无非就是for、while等包含起来的基本运算单元的循环次数 1、二分查找二分查找(binary search...

  • 5

    二分查找的搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜...

  • 1

    【洛谷 P2249】【深基13.例1】查找(向量+二分查找+循环) 精选 原创

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK