一、鞍点问题
思想方法:先找到行中最大,再找最大存在的列中的最小
#include<stdio.h>
#define N 3//任意数
#define M 4//同上
int main()//鞍点问题:该行最大
{
int a[N][M], i, j, max, min, m,I;//m存储序数,i构建列内部循环
printf("来吧,输入九个数字构成3*3的数组,回车键表示输入完成\n");
for (i = 0; i < N; ++i)//input numbers to the array
for (j = 0; j < M; ++j)
scanf_s("%d", &a[i][j]);
for (I = 0; I < N; ++I)
{
max = a[I][0];
for (j = 1; j < M; ++j)//在当前行进行比较
{
if (max < a[I][j])
{
max = a[I][j];
m = j;
}//find the max in the line,then change the i;
}
min = a[I][m];
int flag = 1;//控制输出
for (i = 0; i < N; ++i)
{
if (min > a[i][m])
{
flag = 0;
printf("第%d行你以为的鞍点作废了,非列内最小值\n", I+1);//趣味项目,别人以为你有病系列,其实是为了监测
break;
}
}
if (flag == 1)
printf("功夫不负有心人!你找到了鞍点:%d\n", a[I][m]);
if (flag == 0)
printf("真不好意思,第%d行没有鞍点\n", I+1);
}
return 0;
}
二、有序数组中查找元素
遍历,二分
#include<stdio.h>
#define N 15//任意数
int main()
{
int b, m, i;
int a[N] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };//put numbers in the array
printf("请输入你要找的元素:\n");
scanf_s("%d", &b);//input a
m = (N+1)/ 2;
i = m;
m = m / 2;
do
{
if (b > a[i])
i = i + m;
if (b < a[i])
i = i - (m+1);
if (b == a[i])
{
printf("find it! 是第%d个元素", i+1);
break;
}
if (m == 0)//第一次运行出现问题:端点值无法比较,想到的解决方案:将m的改变推后;然后也将对i的改变做出了调整
{
printf("没找到");
break;
}
m = m / 2;
} while (b != a[i]);
return 0;
}
说明:代码均加了解释符号,如有需要复制的请记得删除解释符号