2013-07-16 7 views
0

В этом коде хранится первое n натуральное число. И порядок числа возрастает. Теперь нам нужно напечатать все число, чтобы a[i] не делится на a[j], где i>j. Вот простой код, который я написал. Я пробовал делать в порядке O (n), используя один цикл. Но это дает значение для мусора.Выполнение последовательности чисел из n натуральных чисел

#include<stdio.h> 
main() 
{ 
    int i=1,n; 
    printf("enter the numbers \n"); 
    scanf("%d",&n); 
    int a[n]; 
    for(i=1;i<=n;i++) 
    { 
     a[i]=i; 
     printf("%d\n",a[i]); 
    } 
    while(a[i+1]>a[i] && a[i+1]%a[i]!=0){ 
     printf("%d",a[i]); 
     i++; 
    } 
} 

ответ

0

Bugs:

1) Проверьте значение i, когда цикл while вводится - это для "мусора" вы говорите.

2) n неинициализирован. Вы используете его при распределении массива.

3) массивы основаны на нуле. Таким образом, в течение цикла, должно быть i=0;i<n

4) во время цикла не заботится о том, i (или i+1) является <n. Потенциально проблема.

Что касается функциональности вашего кода, он не реализует то, что вы описываете. Но SO не является услугой кодирования, и это будет полезно для развития ваших навыков программирования, которые вы делаете сами - сначала возьмите ручку и бумагу и подумайте о потоке программы.

HTH.

+0

i = 0; while (i + 1 a [i] && a [i + 1]% a [i]! = 0) , давая i = 0 до начала цикла и изменения условия цикла while выше, не работают ни , – user2456752

+0

Вы имеете в виду, что код падает, или он не делает то, что вы хотите? Я писал о том, как сделать код нормальным в первую очередь, и я сделал заметку о том, что я рекомендую, если вы хотите, чтобы код делал то, что вы хотите. – ondrejdee

0

При вводе в цикл, пожалуйста, сделайте i=0.

2

В массиве C от 0 до n-1. Также вы забудете сбросить значение i перед входом в цикл while.

+0

нет, он не работает даже после изменения цикла! – user2456752

+0

@ user2456752 может быть из-за индексации массива во время условия. Проверьте это, если вы не делаете ошибку. –

2

Использование malloc выделить память о n Интс:

int *a = (int *)malloc(sizeof(int) * n); //and check that allocation has succeed 

Тогда, не забывайте, что массивы нуля в C. Таким образом, ваш цикл должен быть:

for(i=0;i<n;i++) 

И перед тем, как ввести петлю while, убедитесь, что вы сбросили i и что i + 1 не превышает предел массивов.

+0

Есть ли какая-либо конкретная причина использования malloc и объявление его указателем? – user2456752

+2

@ user2456752 Да, поскольку массив переменных размеров не является жизнеспособным в стандартном C (я имею в виду старый C), я думаю, что он пришел с c99. Поэтому я всегда предпочитаю объявление malloc вместо объявления массивов переменной длины. Но помните, что память, выделенная с помощью malloc/calloc, должна быть явно освобождена с помощью 'free();' Read here: [Variable-length array] (http: //en.wikipedia.org/wiki/Variable-length_array) –

+0

Вы также должны упомянуть, что литье результата malloc не нужно :) – 0decimal0

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