C语言课后习题(31)

150 阅读1分钟

谭浩强C语言第五版的一些课后习题

第六章 第九题

折半查找 (从大到小排列)

int main(){
	int BinarySearch(int s[],int key);
	//由大到小的一组数据
	int arr[5]={0};
	int p;
	printf("输入5个数 从大到小 :\n");
	int i;
	for(i=0;i<5;i++){
		scanf("%d",&arr[i]);
	} 
	printf("输入的数组为:\n");
	for(i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	printf("\n输入需要查找的数:\n");
	scanf("%d",&p);
	printf("找%d\n",p);
	int ans=BinarySearch(arr,p);
	if(ans>=0)
        printf("查找成功!下标为:%d\n",ans);
    else
        printf("查找失败!\n");
    return 0;
}
int BinarySearch(int s[],int key)
{
    int low,high,mid;
    low=0;
    high=5-1;
    while(low<=high)
    {
        mid=(low+high)/2;   //计算中间元素序号
        if(s[mid]==key)     //中间元素与关键字相等
            return mid;
        else if(s[mid]>key)         //中间元素大于关键字
            low=mid+1;     //比它大 往右(小的方向)找 
        else
            high=mid-1;   //比它小 往左(大的方向)找 
  
    return -1;      //查找失败返回-1
}

谭浩强C语言第五版的一些课后习题

第五章 第三题

 输入两个正整数m n,求最大公约数和最小公倍数

int main(){
	int maxnum(int m,int n); //函数声明 
	int minnum(int m,int n);
	//输入两个正整数 求最大公约数和最小公倍数
	printf("输入两个正整数:\n");
	int m,n;
	scanf("%d%d",&m,&n);
	while(m<=0||n<=0){
		printf("输入有误,请重新输入:\n");
		scanf("%d%d",&m,&n);
	} 
	printf("输入成功~\n");
	//函数调用
	int max=maxnum(m,n);
	int min=minnum(m,n);
	printf("最大公约数为:%d\t最小公倍数为:%d\n",max,min); 
	return 0;
}
int maxnum(int m,int n){//求最大公约数 
	int ans=0;
	if(m<n){  //把m指向较大的值 
		int temp=m;
		m=n;
		n=temp;
	}
	//辗转相除法求最大公约数
	while(n!=0){
		ans=m%n;//ans保存余数
		m=n;
		n=ans; 
	}
	return m;
}
int minnum(int m,int n){//求最小公倍数 
    int maxnum(int m,int n);
    int g=maxnum(m,n);//g保存最大公约数 
	int ans=0;
	//最小公倍数=m*n/最大公约数 
	ans=m*n/g;
	return ans;
}