用C++完成:一个含有n项的单调不减的数列a,给定一个数m,在数列a中找到最大的小于m的数,输出这个数,如果找不到则输出-1。
时间: 2024-05-09 18:20:30 浏览: 19
```c
#include <stdio.h>
int main()
{
int n, m, i, a[100];
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int ans = -1;
for(i = 0; i < n; i++)
{
if(a[i] < m)
{
ans = a[i];
}
else
{
break;
}
}
printf("%d\n", ans);
return 0;
}
```
相关问题
用C++倍增的方法完成:一个含有n项的单调不减的数列a,给定一个数m,在数列a中找到最大的小于m的数,输出这个数,如果找不到则输出-1。
```
#include <stdio.h>
#define MAXN 100000
int n, m, a[MAXN + 5], f[MAXN + 5][20];
void init() {
for (int i = 1; i <= n; i++) f[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
f[i][j] = f[i][j - 1] > f[i + (1 << (j - 1))][j - 1] ? f[i][j - 1] : f[i + (1 << (j - 1))][j - 1];
}
int query(int l, int r) {
int k = 0;
while ((1 << (k + 1)) <= r - l + 1) k++;
return f[l][k] < m ? f[l][k] : -1;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
init();
int ans = -1;
for (int i = n; i >= 1; i--) {
if (a[i] < m) {
ans = query(1, i);
break;
}
}
printf("%d\n", ans);
return 0;
}
```
c++实现:给定一个数 N,求出不超过 N 的最大的反质数
反质数指的是,存在一个正整数 m,使得它的约数个数等于 N。因此,我们可以从 N 开始往下枚举数,对于每个数,都计算它的约数个数,直到找到一个反质数为止。
具体实现如下:
```c
#include <stdio.h>
int get_divisor_count(int n) {
int count = 0;
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
count++;
if (i * i != n) {
count++;
}
}
}
return count;
}
int main() {
int n;
scanf("%d", &n);
int ans = 0;
for (int i = n; i >= 1; i--) {
int count = get_divisor_count(i);
if (count == n) {
ans = i;
break;
}
}
printf("%d\n", ans);
return 0;
}
```
首先,读入一个数 N。然后,从 N 开始往下枚举数,对于每个数,都计算它的约数个数。如果约数个数等于 N,就更新答案并退出循环。最后输出答案即可。
需要注意的是,计算约数的时候,只需要枚举到 sqrt(n) 就可以了。因为如果存在一个大于 sqrt(n) 的约数 k,那么必然存在一个小于 sqrt(n) 的约数 n/k。同时还需要注意,如果 n 是完全平方数,那么 sqrt(n) 只能算一次。因此,在计算约数个数的时候,需要特判一下。