#include <iostream>
#include<ctime>
#include <stdlib.h>
#include <stdio.h>
int main() {
<span> srand(time(NULL));
</span> int a[20];
int maxi,minim,res,i;
i=0;
maxi=-2000;
minim=2000;
printf("Array:");
for(i=0;i<20;i++){
a[i]=rand()%50-25;
printf("%d ",a[i]);
if(maxi<a[i]){
maxi=a[i];}
if(minim>a[i]){
minim=a[i];}
}
minim=abs(minim);
maxi=abs(maxi);
res=maxi-minim;
printf("\n%d",res);
getchar();
getchar();
}<span>
</span>
Итак, нужно найти число групп, в каждой из которых ни одно из чисел не делит все остальные.
Строим группы так:
(1) - 1
(2) - 2, 3, 5, 7, 11, 13... - все простые
(3) - 4, 6, 9, 10, 14, 15... - произведения двух простых
...
(k) - произведения (k - 1) простых
И так пока не кончатся все числа. Поскольку в каждой группе наименьшее число 2^(k - 1), то k - минимальное, для которого 2^(k - 1) > N
По построению явно во всех группах ни одно число не делится на другое. Осталось проверить, что получено минимальное число групп.
Это очевидно: числа 1, 2, 4, ..., 2^(k-1) должны быть в разных группах.
Решение:
n = int(input())
t = 1
k = 0
while t <= n:
t *= 2
k += 1
print(k)