2011-05-16 2 views
-1

Мой учитель попросил меня создать цикл, который будет выполнен 1M раз. Я пробовал for(long i=0;i<1000000;i++), но программа рушится. Максимальное количество, которое принимает программа, составляет 10.000.Как создать цикл 1M со случайными числами> 100000

Любые идеи? Это возможно?

Также он попросил меня создать случайное число> 100.000. Я использую rand();. Должен ли я использовать другой метод?

это код:

start_time = clock(); 
for(long i=0;i<1000000;i++){ 
    num1 = rand(); 
    num2=rand(); 
    gcd1(num1,num2); 
} 

end_time = clock(); 

elapsed_time = (end_time - start_time)/CLOCKS_PER_SEC; 

printf("time is %.3f seconds\n", elapsed_time); 
system("pause"); 

Это НОД:

int gcd1(int x, int y){ 
    int z; 
    if (x<y) 
     z=x+1; 
    else if (y<x) 
     z=y+1; 
    do{ 
     z=z-1; 
    } 
    while((x%z!=0) or (y%z!=0)); 
     return z; 
    } 
} 
+3

I просто созданный случайный номер специально для вас: 100001. – hirschhornsalz

+0

Что такое "1M раз"? Одна тысяча? Один миллион? Одна миллисекунда?Кроме того, вы действительно должны опубликовать код, который рушится. Цикл, который вы дали, вероятно, не сработает без какой-либо помощи из содержимого цикла. –

+0

должно быть помечено домашним заданием. –

ответ

0

Попробуйте петлю как

for (i = 0; i < 1000000; i++) { 
    do num1 = rand(); while (num1 == 0); 
    do num2 = rand(); while (num2 == 0); 
    gcd1(num1, num2); 
} 

rand() может вернуть 0. Когда он делает это (после более чем 10000 циклов), ваша программа будет установлена ​​z до 0 и попытаться разделить на 0.

1

Там нет ничего плохого в том, цикл, который проходит от 0 до 1000000. причине того, что ваша программа врезаться является что-то еще, что вы делаете в своей программе.

0

использовать длинные позиции, в цикле более длинных интервалах:

for (long i = 0; i < 1000000L; i++) { 
    //do something 
} 

для больших Randoms, вы могли бы отлитые возвращение рандов() до тех пор, и перемножить два вместе или что-то подобное. (Хех, вероятно, показывает свой возраст этот ответ ... назад, когда я регулярно кодирования C, внутр было только 16 бит;.)

+1

... и мы были рады, что ** эти 16 бит! –

1

Выполните одно из следующих действий:

  • Шаг через код в отладчик, чтобы найти, какая строка сбой.
  • Прокомментировать строки в цикле (и после него), пока он не запустится. Затем разобьем вещи один за другим, чтобы выследить преступника.

Одна из подозрительных вещей, которые я вижу с места в карьер: Какой тип elapsed_time объявлен как? Вы делаете то, что выглядит как целое (или квадратное целое?) Математическое на нем, а затем вы указываете printf, чтобы напечатать его как плавающий. printf не делает преобразования интеллектуального типа для вас или чего-то еще. Если вы подаете ему переменную неправильного типа, вы можете получить мусор или сбой.

+0

ОК, я сделал это. num1 и num2 = rand(); сбой петли. – user622203

+0

@ user622203 - Просто, чтобы дважды проверить, попробуйте прокомментировать вызов gcd1() и раскомментируйте эти два вызова 'rand()'. Иногда процедура может перехватывать стек, и вы не видите проблему до тех пор, пока не будет вызвана следующая функция. –

1

в НОД

у вас есть дополнительный закрывающая фигурная скобка

если х == у, то г не определен; так плохие вещи могут произойти

0

В этом заявлении

while((x%z!=0) or (y%z!=0)); 

мой компилятор я (LLVM-GCC-4.2) не будет компилировать его. Я просто изучаю c, но я думаю, вы хотите изменить «или» на «||»

Смежные вопросы