一.求两数最大公约数

方法:

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

例如:

32 / 26 = 1…6

26 / 6 = 4…2

6 / 2 = 3…0

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

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include//求两数最大公约数//辗转相除法:反复的将除数当作被除数去除余数,直到余数为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.

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

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){right=mid-1;//更新右数下标}

将以上步骤综合。如下。

#define _CRT_SECURE_NO_WARNINGS 1#includeint 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  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;imax){max=arr[i];//更新最大值}if(arr[i]<min){min=arr[i];//更新最小值}}

以上综合。

如下:

#define _CRT_SECURE_NO_WARNINGS 1#includeint 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  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//多组输入,一个整数(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#include#include#includeint 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毫秒//引头文件system("cls");//打印之后清理屏幕//引头文件right--;//右边--left++;//左边++ //向中间聚拢}printf("%s\n", arr2);return 0;}

谢谢各位阅读!