第一题马鞍点:
使用一个判断函数,时间复杂度 O(n^3);
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[20][20];
bool flag;
bool saddle(int x,int y){
//判断是否是行最大
for(int j = 1; j <= m; j++)
if(a[x][y] < a[x][j]) return false;
//判断是否是列最小
for(int i = 1; i <= n; i++)
if(a[x][y] > a[i][y]) return false;
return true;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n ;i++)
for(int j = 1; j <= m ; j++)
cin >> a[i][j];
for(int i = 1; i <= n ;i++)
for(int j = 1; j <= m ; j++)
if(saddle(i,j)){
printf("%d %d %d\n",i,j,a[i][j]);
flag = true;
}
if(!flag) cout << "NO"<<endl;
return 0;
}
第二题:判断完美数和10000内的所有完全数
【垃圾题】这道编程题其实可以分为两个问题出
要求:
1. 输入一个n,然后需要判断它是否符合:该数的所有因子相加等于该数,如果符合返回true,如果不符合则返回false;
2. 第二行,请输出所有X,X = 2^(素数y-1) * 2^素数y,要求X<=10000,所有X从小到大排列。
算法思想
1. 对于第一个问题,编写一个函数,可以找出该数字的所有因数,并相加检验其是否符合标准。
2. 对于第二个问题,遍历1-15之间的所有素数就可以找出1w以内,符合要求的所有数了,因为2的14次方已经超过1w了,因此这个素数肯定是在10以内的,保险起见我们取个15。其次本题找质数还有一个优化思路,就是不用遍历1~x之间的所有数看他是否是目标质数的因子,只需遍历1~x/2即可。具体证明见语法基础课。
#include <bits/stdc++.h>
using namespace std;
bool perfectNumbers(int x){
int res = 0;
for(int i = 1; i <= x ;i++)
if(x % i == 0 ) res+= i;
return (res == x);
}
bool primeNumbers(int x){
if(x < 2)
return false;
for(int i = 2; i <= x / i; i++)
if(x % i == 0)
return false;
return true;
}
int main(){
int n;
cin >> n;
if(perfectNumbers(n)) cout << "True"<<endl;
else cout << "False" << endl;
for(int i = 1 ; i <= 15; i++){
//如果是素数
if(primeNumbers(i)){
int res = pow(2,i-1) * (pow(2,i)-1);
if(res <= 10000) cout << res << ' ';
}
}
return 0;
}