二分查找法 | 最大公约数 | 打擂台 | 打印x图形 | 从两边向中间打印等题目 | 详解 | C语言

一.求两数最大公约数

方法:

辗转相除法:反复的将除数当作被除数去除余数,直到余数为0截止,此时的除数就是原始两数的最大公约数。

例如:

32 / 26 = 1...6

26 /   6 = 4...2

6   /   2 = 3...0

根据以上方法,2就是32与26的最大公约数

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>//求两数最大公约数
//辗转相除法:反复的将除数当作被除数去除余数,直到余数为0截至,此时的除数就是原始两数的最大公约数。
int main()
{
	int x = 0;
	int y = 0;
	


	while (scanf("%d%d", &x, &y)==2)//多组输入
	{

		
		int max = 0;
		if (y > x)
		{
			max = y;
			y = x;
			x = max;//保证x永远是较大数
		}
		int i = x % y;//i是x与y的余数

		
		while (i!=0)//不断的将除数当作被除数去除余数,直到余数为0截至,此时除数就是原始两数的最大公约数
		{

				x = y;
				y = i;
				i = x % y;//i是x与y的余数
			
		}
		printf("%d是x与y的最大公约数\n", y);
	}


	return 0;
}

 二.二分查找法(折半查找法)

二分查找法即折半查找,每次查找后可去掉原始数据的一半。

二分查找法相对于暴力枚举法具有查找效率高,速度快的优点(尤其是对于一组较为庞大的数据)。

但是注意,二分查找法仅仅适用于查找一组有序的数中的元素。而对于一组无序的数,则需先进行排序后再使用二分查找法。

举例:

假设,找7.

46c479bb7dff44b88f047ee74bfbcd5e.png

首先确定最左边元素,最右边元素下标。如下:

int sz=sizeof(arr)/sizeof(arr[0]) //计算数组元素个数
int left=0;  //最左边元素下标
int right=sz-1;  //最右边元素下标

然后,去求中间元素的下标。如下:

int mid=left+(right-left)/2;  //中间元素下标

下标所对应的元素与所要找的元素比大小,(此例寻找的是7,暂且拿7做比较)

if(arr[mid]<7)
{
  left=mid+1;//更新左数下标
}
else if(arr[mid]>7)
{
  right=mid-1;//更新右数下标
}

将以上步骤综合。如下。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int arr[10] = { 0 };
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);//数组中的元素的个数
    for (i = 0; i < sz; i++)//输入十个数
    {
        scanf("%d", &arr[i]);
    }
    //假设输入的十个数是正序的
    //进行二分查找
    int flag = 0;//用来判断是否找到了所要找的数
    int x = 0;//要查找的数
    printf("请输入你要查找的数:");   scanf("%d", &x);
    int left = 0;//刚开始最左边的数的下标
    int right = sz - 1;//刚开始最右边的数的下标
    while (left <= right)
    {
        int mid = left + (right - left) / 2;//计算中间的数的下标//可以排查掉一半
        if (x > arr[mid])//如果要查找的数大于中间的数,更新左数下标
        {
            left = mid + 1;//排查掉一半

        }
        else if (x < arr[mid])//如果要查找的数小于中间的数,更新右数下标
        {
            right = mid - 1;//排查掉一半

        }
        else if (x==arr[mid])//此时x==arr【mid】就说明left==right已经定位的只剩最后一个数了//如果x==arr【mid】就说明找到了 //否则就找不到
        { flag = 1;
            printf("找到了,这个数的下标是 :%d\n", mid);
            break;//找到了就退出
        }

    }
    if (flag == 0)
    {
        printf("找不到\n");
    }


    return 0;
}

三.打擂台法找最大-最小数

通过打擂台来寻找最大最小数。

1.先假定最大数是arr[0],最小数也是arr[0].

如下:

int max=arr[0];
int min=arr[0];  //假定最大值,最小值都是arr[0]

2.for循环,数组中的元素一个一个比。

如下:

int sz=sizeof(arr)/sizeof(arr[0]);  //数组中元素的个数
for(int i=0;i<sz;i++)  //sz个元素,比sz-1次
{
  if(arr[i]>max)
  {
  max=arr[i];  //更新最大值
  }
  if(arr[i]<min)
  {
  min=arr[i];  //更新最小值
  }
}  

以上综合。

如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组中元素的个数


	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);  //输入数组中元素的值
	}


	int min = arr[0];
	int max = arr[0];
	for (int i = 0; i < sz; i++)  //sz个数,比sz-1次
	{
		if (arr[i] > max)
		{
			max = arr[i];  //更新最大值
		}
		if (arr[i] < min)
		{
			min = arr[i];  //更新最小值
		}
	}

	printf("max=%d\n", max);
	printf("min=%d\n", min);



}

四.打印x图形

要站在计算机的角度思考编程问题。

如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
//针对每行输入,输出用“*”组成的X形图案。
int main()
{
	int input = 0;  //输出的行数


	while (scanf("%d", &input) == 1)  //多组输入
	{
		for (int i = 1; i <= input; i++)  //外层循环,控制行
		{
			for (int j = 1; j <=input; j++)  //里层循环,控制列
			{
				if (i == j||input==i+j-1)  //打印'*'的两个条件:1.行等于列   2.输入的数等于行+列-1
					                       //满足一条即打印
				{
					printf("*");
				}
				else  //以上两个条件都不满足:打印空白字符
				{
					printf(" ");
				}
			}
			printf("\n");
		}
	}



}

五.从两边向中间打印

注意:需保证两数组元素个数相同。

如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
	char arr1[] = { "Welcome To CSDN" };
	char arr2[] = { "***************" };  //注意:两数组元素个数相同
	
	int sz = strlen(arr1);  //计算字符串数组的长度  //注意计算的是'\0'前面的字符
	
	int right = sz-1;  //最右边字符对应的下标 
	int left = 0;      //最左边字符对应的下标
	  

	while(left<=right)  //左下标小于等与右下标
	{
		arr2[right] = arr1[right];  //替换
		arr2[left] = arr1[left];  //替换
		 

		
		printf("%s\n", arr2);
		Sleep(1000);  //打印之后睡眠1000毫秒  //引头文件<Windows.h>
		system("cls");  //打印之后清理屏幕    //引头文件<stdlib.h>
		right--;  //右边--
		left++;  //左边++   //向中间聚拢
	}
	printf("%s\n", arr2);


	return 0;
}

谢谢各位阅读!

猜你喜欢

转载自blog.csdn.net/nmbg11/article/details/134767983
今日推荐