一、实验目的与要求
1、熟悉二分搜索算法;
2、掌握分治算法;
3、能对设计的算法进行复杂度分析。
二、实验题目
1、最多约数问题。正整数x的约数是能整除x的正整数,正整数x的约数个数记为div(x)。例如:1,2,5,10都是10的约数,且div(10)=4。设a和b是2个正整数,a≤b,找出a和b之间约数个数最多的数x。
2、设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
三、实验步骤
1、算法思想描述
- 用C/C++实现的程序代码、
- 运行结果
一、
#include<iostream>
#include<stdio.h>
int countsum(int n)
{
int count=0;
for(int i=1;i<=n;i++)
{
if(n%i==0)
{
count++;
}
}
printf("%d的约数有%d个\n",n,count);
return count;
}
int main()
{
int max=0;
int maxnum=0;
int minnum=0;
int a;
int b;
printf("请输入要比较的两个数:\n");
scanf("%d",&a);
scanf("%d",&b);
maxnum=countsum(a);
minnum=countsum(b);
max=(maxnum-minnum)>0?a:b;
printf("约数个数最多的数为%d\n",max);
}
二、
#include<stdio.h>
#include<stdlib.h>
int search(int a[],int length,int x)
{
int i=0,j=0;
int detection=-1;
int top=length-1;
int middle=0;
int low=0;
while(low<=top)
{
middle=(low+top)/2;
if(a[middle]==x)
{
detection=middle;
}
if(a[middle]<x)
{
low=middle+1;
}
else
{
top=middle-1;
}
}
if(detection==-1)
{
i=top;
j=low;
}
else
{
i=detection;
j=i;
}
printf("i的值为:%d\nj的值为:%d\n",i,j);
return 0;
}
int main()
{
int arr[]={5,23,24,36,48,55,60,100};
int length=sizeof(arr)/sizeof(int);
search(arr,length,2);
system("pause");
}
四、实验小结