2013-03-31 2 views
3

Любая помощь была бы высоко оценена с этой проблемой, с которой я столкнулся. Я пытаюсь создать цикл, чтобы найти массив 30x30, чьи основные диагональные значения больше или равны 7. Массивы заполняются случайными целыми числами.C Программирование Array Loop

Моя проблема - это сама петля, я не могу понять, как создать такую ​​большую серию петель.

Когда мне удалось создать массив, соответствующий критериям, мне нужно отобразить, сколько попыток было выполнено. Если требуется более 1 миллиона попыток, программа должна просто «отказаться», показывая, что это невозможно.

Это то, что мне удалось найти до сих пор (не весь код, просто бит, в котором мне нужна помощь), однако выход буквально ничего. Я гарантирую, что не приближаюсь к правильному решению ... но я был бы признателен за правильное направление!

Заранее спасибо :)

count=0; 

for(a=0;a<30;++a) 
for(b=0;b<30;++b) 
    random2[a][b]=rand()%10; 

while(count<=1000000) 
{ 
for(a=0;a<30;++a) 
{ 
    if(random2[a][a]>=7) 
    {  
     ++a; 
     if(a==30&&random2[a][a]>=7) 
      printf("%d", count); 
    } 
     else 
     { 
      ++count; 
      for(a=0;a<30;++a) 
       for(b=0;b<30;++b) 
        random2[a][b]=rand()%10; 
     } 
} 
} 

printf("%d", count);      

ответ

1

Вы сделали некоторые странные вещи в ваших петель. Простые исправления - удалить один из ++a с (я бы предложил второй) и break в другом.

Лучшее решение - это код, который вы имеете в виду. Для того, чтобы минимально изменить свой пример:

int count,a,b; 
for(count = 0; count<=1000000; ++ count) { 
    for(a=0;a<30;++a) 
     for(b=0;b<30;++b) 
      random2[a][b]=rand()%10; 
    for(a=0;a<30;++a) 
    { 
     if(random2[a][a]>=7) 
     { 
      if(a==30&&random2[a][a]>=7) 
      printf("%d", count); 
     } 
     else 
     { 
      break; 
     } 
    } 
    if(a == 30) { 
     break; 
    } 
} 

Еще лучше исправить это рассчитать массив алгоритмический вместо того, чтобы полагаться на случайности, чтобы дать вам хороший результат. Например, установите диагональ в случайном порядке 7, 8 или 9 (что даст тот же конечный результат и вероятности).

1

я думаю, что проблема в линии

if(a==30&&random2[a][a]>=7) 

, так как вы говорите массив 30х30, максимальное значение индексов 29x29. поэтому random2[30][30] не существует. Что касается кода, попробуйте

while(count<=1000000) 
{ 
    for(a=0;a<30;a++) 
    { 
    for(b=0;b<30;b++) 
    { 
     random2[a][b]=rand()%10; 
     if(a==b) 
     { 
      while(random2[a][a]<7) 
      { 
        ++count; 
        random2[a][b]=rand()%10; 
      } 
     } 
    } 
    } 
} 

это даст вам массив, нужно

, если вы хотите, чтобы значение счетчика будет меньше, использование,

if(random2[a][a]<7) 
{ 
    random2[a][a]=(rand()+7)%10 
} 
+0

Это похоже на работу по большей части, спасибо большое. ОДНАКО, значение, которое я получаю как результат, всегда находится между 1000000 и 1001000, что кажется довольно странным. :П – user2229471

1

Вы смешиваете внутренний for-loop counter 'a' со счетчиком значений (который также является «a» в вашей программе). Попробуйте что-то вроде этого:

int found = 0; 
for (count = 1; count <= 1000000 && !found; count++) { 
    // (re)fill the array with random numbers 
    for (a = 0; a < 30; a++) for (b = 0; b < 30; b++) random2[a][b] = rand() % 10; 
    // now check the array 
    found = 1; // assume all values are >= 7 
    for (a = 0; a < 30; a++) 
    if (random2[a][a] < 7) { // found a bad value 
     found = 0; 
     break; 
    } 
}