2014-09-30 2 views
-1
Example input: 20 10 5 20 2 20 20 20 2 2 0 

Output: 
(20*5) 
(10*1) 
(5*1) 
(2*3) 

Я только начал программировать этот семестр и нуждался в помощи по проекту. Прошу прощения, если мой вопрос неясен.Целесообразные целые числа, использующие программирование на С

Так что в основном я должен вводить положительные целые числа до ввода «0», чтобы закончить программу. Мне не разрешено использовать массивы (что бы это ни значило).

#include <stdio.h> 


int main() 
{ 
int number, count=0 

while(1) 
{ 
    scanf("%d",&number); 
    if (number!=0) 
    { 
     count++; continue; 
    } 
    else 
    { 
     printf("%d*%d",number,count); 
     break; 
    } 
    return 0; 
} 

Как хранить эти несколько номеров, так что я бы не перекрывать предыдущий номер и для увеличения числа повторяющихся на 1 каждый раз, когда он вошел? Я не могу попросить моего профессора о помощи; он просто говорит мне, чтобы он сделал это.

«Определенное инженерное устройство управляется с помощью ввода последовательных чисел (целых чисел). Если есть запуск одного и то же число, устройство может оптимизировать свою производительность. Таким образом, мы хотели бы организовать данные так, чтобы указать, что запуск идет. Напишите программу C, что читает последовательность чисел и печатает каждый пробег чисел в форме (n * m), где m - это число, повторяемое n раз. Обратите внимание, что запуск может состоять из всего лишь одного номера. Номера ввода заканчиваются нулем, что останавливает устройство ».

+0

Почему вы не можете использовать массивы под вопросом? Вы хотите подсчитать частоту, которая может быть эффективно решена с помощью массивов. Для идеи вы можете проверить [этот пост] (http://stackoverflow.com/questions/11053607/count-how-many-times-an-element-occurs-in-an-array-java). –

+0

Если он специально сказал, что вы не можете использовать массивы, вы можете использовать связанный список, но я думаю, что это противоречит духу задания. – IllusiveBrian

+0

Извините, что он должен быть номером –

ответ

3

Это задание, по-видимому, основано на полуспешном знании кодирования длины пробега (RLE). Во всяком случае, вот псевдокод, который делает то, что он просит.

in = read next number from input 
current_num = in // let the 1st number in list be current_num 
count = 1 

loop 
    in = read next number from input 
    if (in == 0) break // we are done, get out of loop 

    else if (in == current_num) count += 1 

    else  // run has ended, print it and start new run 
     print current_num * count 
     current = in 
     count = 1 

end loop 

print current_num * count // we exited the loop before printing the last run 
           // so do it outside the loop 

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

Редактировать Чтобы быть ясным, задание запрашивает «запуск» чисел, но на выходе образца отображается «счет» чисел. Эти два являются не то же самое.

+0

это не так много выход выше! – chouaib

+0

Хотя это то, о чем я думал, что код, вероятно, запрашивал, не соответствует назначению, так как, как видно из вывода примера, он прочитал и организовал весь прогон перед его печатью, а не только для печати последовательных дубликатов. Однако это имеет больше смысла, чем фактическое назначение. – IllusiveBrian

+0

@chouaib Я тоже прокомментировал вопрос. Назначение запрашивает «запуск» чисел, но так называемый примерный вывод показывает «подсчет» чисел. Вывод данных, заданный в вопросе, неверен. –

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