2013-11-23 4 views
-2

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

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

В этом случае ответа должен быть: да (он успешно будет изучать его в течение 20 дней), и (в течение 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; 
} 
+0

Почему вы спрашиваете, а не просто пытаетесь запустить ваш код? –

+1

Вы имеете в виду, можно ли считать, а не вычислять 'n + 1-z'? Да, создайте новую переменную 'count' и выполните' for (i = z, count = 0; i <= n; i = i + 1, count ++) '. Вы обращались с какой-либо мыслью к проблеме перед публикацией? – mah

+0

Я не понимаю, о чем вы просите, извините. Что вы подразумеваете под «count numbers»? – Mat

ответ

0

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

// 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; 
} 

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

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"; 

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

+0

@ Parvizal отметить, что ответ должен быть 11 дней, чтобы узнать 100 слов. Если я применил ваш заданный цикл, я получаю 24 дня. Это неверно. – Beckleen

+0

Странно. Я проверил свою петлю, и я получил «Тебе нужно 11 дней, чтобы выучить 100 слов», напечатанных на моем экране. – Parzival

+0

@ Parvizal Ну, если я запускаю только тот, который вы написали для меня, он работает. Но если я поместил его в свой код, это даст мне 24. Май. Вы знаете, почему? – Beckleen

1

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

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


    } 

cout<< i << endl; 

Вы можете просто видеть значение переменной «я» 's сразу после цикла

0

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

Было бы намного проще вычислить дни, необходимые для изучения слов (это просто квадратное уравнение), и сравнить его с 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";