Работа с файлами и циклом FOR

-6

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

Скажем, что ему нужно выучить 100 слов. У него 20 дней. В первый день он выучил 5 слов. На следующий день он узнал 1 слово больше, чем за день до этого.

В этом случае ответ должен быть: да (он успешно изучит его в течение 20 дней) и 11 (за 11 дней он выучит 100 слов).

У меня есть код.

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{

int n, d=0, k, z;

ofstream fr("Rezults.txt");
ifstream fd("Data.txt");
fd>>n>>d>>z>>k;

int learned_words = 0;

for(int i=0; i<d; i++){
learned_words += z;
z = z+k;
}

if(n<=learned_words) {
fr<<"Yes"<<endl;
}
else
{
fr<<"No"<<endl;

}

z=z-d; d=0;
for(int m=0; m<=n; m+=z, z+=k, d++) {}

cout << "You need " << d << " days to learn " << n << " words";

fd.close();

fr<<d;

fr.close();

return 0;
}

спросил(а) 2013-11-23T18:39:00+04:00 6 лет, 8 месяцев назад
0
87

Эта простая функция решает проблему в начале вашего вопроса:

// z : the number of words learned during the first day
// k : this much more we learn after every day
// (i.e first day we learn z words, then z+k, then z+k+k etc.)
// d : this many days we have time to learn
// n: this many words we should learn

bool solve(int z, int d, int k, int n) {

int learned_words = 0;

for(int i=0; i<d; i++){
learned_words += z;
z = z+k;
}

if(n<=learned_words) {
return true;
}
return false;
}

Чтобы ответить на ваш вопрос о циклах, я думаю, что следующий очень простой цикл будет работать:

int n = 100;
int z = 5;
int k = 1;
int d = 0;

for(int m=0; m<n; m+=z, z+=k, d++) {}

cout << "You need " << d << " days to learn " << n << " words";

Здесь цикл будет выполняться минимальное количество раз, необходимое для изучения этих n слов. Переменная d подсчитывает нужные дни и должна быть объявлена перед циклом. m подсчитывает, сколько слов мы узнали.

ответил(а) 2013-11-23T19:56:00+04:00 6 лет, 8 месяцев назад
57

Вы можете просто подсчитать цикл, используя цикл for следующим образом:

 for (i=z; i<=n; i++)
{

}

cout<< i << endl;

Вы можете просто увидеть значение переменной "i" сразу после цикла

ответил(а) 2013-11-23T18:45:00+04:00 6 лет, 8 месяцев назад
40

Несмотря на то, что for loop в заголовке нет требования к циклу в задаче и нет причин действительно использовать его здесь (если только вы не ограничены целочисленной арифметикой).

Было бы намного проще вычислить дни, необходимые для изучения n слов (это простое квадратичное уравнение) и сравнить его с d.

Количество слов (y), полученных в течение первых x дней: y = z * x + k * x * (x-1)/2. Поэтому просто решим это уравнение для y = n.

Я бы сделал что-то вроде: (переменные a и b являются коэффициентами квадратичного уравнения).

const double a = k/2.0;
const double b = z-k/2.0;
const double days_needed = -b + ::sqrt(b*b + 4 * a * n)/(2.0 * a);
std::cout << (days_needed <= d ?"yes":"no") << ", you need " << ::ceil(days_needed) << "days\n";

ответил(а) 2013-11-23T22:52:00+04:00 6 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема