一.求两数最大公约数
方法:
辗转相除法:反复的将除数当作被除数去除余数,直到余数为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.
首先确定最左边元素,最右边元素下标。如下:
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;
}
谢谢各位阅读!