gogo6996 Ответов: 1

Решите этот алгоритм


Призрак и тень играли в какую-то игру. Тень дает призраку число n, и призрак должен дать печенье тени. Количество файлов cookie вычисляется как максимальный делитель n (не равный n, конечно). Например, если n = 6, призрак должен дать 3 печенья, в то время как для n = 25 ему нужно дать 5, а если n = 2, ему нужно дать только 1 печенье.

Поскольку Призрак очень умен, он хочет обмануть тень. Он вводит правило, гласящее, что он может разбить n на несколько n1 + n2 + ... + nk = n (здесь k произвольно и k = 1 также возможно), и он даст печенье в соответствии с этими разделенными частями. ni 2, для всех i от 1 до k.

Помогите призраку рассчитать, сколько печенья он должен дать.

Что я уже пробовал:

Мой код работает для разделения числа на две части

Kenneth Haugland

Используйте формулу (k^2+k)/2.

1 Ответов

Рейтинг:
2

OriginalGriff

Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


gogo6996

//тень дает призраку число n
//если n =6 призрак должен дать 3 печенья
//если n =2 призрак должен дать 1 печенье
//работа для разделения на две части
//он всегда будет разбивать число на две части
//и номер файла cookie всегда будет 2

#include <iostream>

использование пространства имен std;

набор структур typedef{
int x;
int y;
}вектор;

векторный набор данных[100];
int count = 1;

int fact(int n){
int j=1;


for(int i=1;i<n;i++){
если(n%i == 0){
j=i;
}
}
возвращение Дж;
}

//мы должны ввести концепцию простых чисел, чтобы свести к минимуму количество файлов cookie
bool isPrime(int n)
{

если (n <= 1) вернуть false;


for (int i=2; i<n; i++)
если (n%i == 0)
возвращать false;

вернуть true;
}

int split(int n){

int m=0;
for(int i=2;i<n;i++){
for(int j=2;j<n;j++){
если(i+j == n){
считать++;
набор данных[m].x = i;
набор данных[m].y = j;
m = m+1;
}
}
}
}

int findMin(int arr[],int n){
int minthisfunc = arr[0];
int i ;
int minindex = 0;
для( i=1;i<n;i++){
if(minthisfunc > arr[i]){
minthisfunc = ОБР[я];
}
}

для( i=1;i<n;i++){
if(minthisfunc == arr[i]){
вернуться я;
}
}

}

тап_п()
{
int n;
cout<<"дайте номер"<<endl;
cin>>n;

если(n>0 & & amp; n<10){
if(isPrime(n)){
cout<<n<<endl;
возвращает 0;
}
}

сплит(n);

int min[1000] ;
int j=0;




for(int i=0;i<count-1;i++){
мин[Дж] = факт(набора данных[я].х)+то(набора данных[я].г);
++Дж;
}

int ans = findMin(min,count-1);

соиь<&ЛТ;"нет.куки-и GT;"&ЛТ;&ЛТ;факт(набора данных[Анс].х)+то(набора данных[Анс].г) в<<епси;
соиь<&ЛТ;"("&ЛТ;&ЛТ;набор данных[Анс].х&ЛТ;&ЛТ;","&ЛТ;&ЛТ;набор данных[Анс].г&ЛТ;&ЛТ;")";

возвращает 0;
}

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
И приводит примеры тестовых случаев, которые работают, а которые нет.

gogo6996

он работает только для некоторых тестовых случаев .Пожалуйста помочь

OriginalGriff

Для каких тестовых случаев это работает, а для каких нет?
Каковы общие факторы в тестовых данных?

Что вы пытались выяснить, в чем проблема?

Написание кода-это самый простой бит: заставить его работать-это основная часть вашей задачи!

Nelek

Не согласиться... основная часть его задачи-понять, что он делает / должен делать. Пока что он терпит неудачу :вздох:

OriginalGriff

Давайте сначала сделаем самые простые вещи! :смеяться: