2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
1

подсчет количества цифр

13.10.2009, 19:34. Показов 2632. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
собственно текст задачи:
Первая и вторая строки входного файла(можно вводить с клавиатуры, а не файлом) содержат начало и конец промежутка времени. Начальное время не превосходит конечное. Время задается в формате hh:mm:ss (0<=hh<24; 0<=mm<60; 0<=ss<60). Числа дополнены по необходимости нулями. Необходимо вывести 10 строк, в i-ой строке должно быть прописано, сколько раз встречается цифра ( i -1 ).

Задача была на олимпиаде по программированию, прошедшей у меня сегодня.
начало сделал
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Program Chas;
 
Uses CRT;
 
Var
time1,time2:string;
i,h1,h11,h12,h2,h21,h22,m1,m11,m12,m2,m21,m22,s1,s11,s12,s2,s21,s22:byte;
a:array[1..10] of integer;
 
begin
 
readln(time1);
readln(time2);
{ввели время, как в задаче, типа hh:mm:ss}
 
for i:=1 to 10 do
a[i]:=0;
{забили начальное количество цифр нулями}
 
{начинаем перевод строк в понятный формат}
val(time1[1],h11,i);
val(time1[2],h12,i);
h1:=10*h11+h12;
 
val(time1[4],m11,i);
val(time1[5],m12,i);
m1:=10*m11+m12;
 
val(time1[7],s11,i);
val(time1[8],s12,i);
s1:=10*s11+s12;
 
{Первое число закончено}
 
val(time2[1],h21,i);
val(time2[2],h22,i);
21:=10*h21+h22;
 
val(time2[4],m21,i);
val(time2[5],m22,i);
m2:=10*m21+m22;
 
val(time2[7],s21,i);
val(time2[8],s22,i);
s2:=10*s21+s22;
 
{второе закончили}
{начало проблемного участка}
.....
.....
{конец проблемного участка}
for i:=1 to 10 do
writeln(a[i]);
{выводим ответ}
мы получили время в понятном для паскаля виде
дальше начался ступор
есть какие-нибудь предложения, как решить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2009, 19:34
Ответы с готовыми решениями:

Подсчет количества цифр равных 3 в числе
Вводиться число и в этом числе подсчитать количество цифр равно трем P.S Пожалуйста если не...

Подсчет количества одинаковых цифр в числе
Программа подсчета одинаковых цифр в числе.

Рекурсия: подсчет количества цифр в заданном натуральном числе
12Подсчитать количество цифр в заданном натуральном числе. Составить рекуррентную функцию.

Подсчет количества различных значащих цифр в десятичной записи числа
Здравствуйте уважаемы форумчане! Помогите решить задачу: составить программу подсчета количества...

18
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.10.2009, 20:01 2
Цитата Сообщение от LeXa4894 Посмотреть сообщение
необходимо вывести 10 строк, в i-ой строке должно быть прописано, сколько раз встречается цифра ( i -1 ).
И зачем всякие преобразования, если нужно посчитать количество символов?
Pascal
1
2
3
4
5
6
7
for i:=1 to 10 do
 begin
   k:=0;
   for j:=1 to length(s[i]) do
   if s[i][j]=chr(ord(i-1)+48)then k:=k+1;
   s[i]:=s[i]+' '+chr(ord(k)+48);//к не больше 6
 end;
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
13.10.2009, 20:05  [ТС] 3
если я не указал, нужно посчитать количество цифр от 0 до 9 во всех записях времени, ограниченный данными, т.е. если начало 23:59:58 и конец 23:59:59 получится 0-0-2-2-0-4-0-0-1-3 а если начало промежутка 13:24:09 а конец 13:24:40 5-45-45-45-36-3-3-3-3-4
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.10.2009, 20:08 4
Ничего не понятно. Если цифр одинаковых может быть больше 9 то тогда так
Pascal
1
2
3
4
5
6
7
8
for i:=1 to 10 do
 begin
   k:=0;
   for j:=1 to length(s[i]) do
   if s[i][j]=chr(ord(i-1)+48)then k:=k+1;
   str(k,s1);
   s[i]:=s[i]+' '+s1;
 end;
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
13.10.2009, 20:11  [ТС] 5
тогда пишу задачу текстом
Петя очень любит наблюдать за электронными часами. Он целыми днями смотрел на часы и считал, сколько раз встречается каждая цифра. Через несколько месяцев он научился по любому промежутку времени говорить, сколько раз на часах за это время встретится каждая цифра.

написать программу, которая сможет проделывать такие-же действия

и объяснять, как это сделано можно?
и лучше на пальцах, а то сегодня думать уже не получается
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.10.2009, 20:14 6
Во, это другое дело. Тут попотеть нужно. Удачи! Я олимпиадные задачи отличникам не решаю. Только двоешникам.
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
13.10.2009, 21:03  [ТС] 7
Pascal
1
2
3
4
5
6
if h2-h1>1 then 
begin
a[1]=(h2-h1-1)*{коэффициент, сколько встречается данная цифра в 1 час
+сколько встречается в кончике до конца часа
+сколько в начале часа до конечного времени}
{повторить 10 раз, для цифр 0-9}
вот с этим может кто помочь?
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
14.10.2009, 22:19  [ТС] 8
второй вариант
делаем начало и конец интервала времени в секундах
потом представляем это число в обычном виде(hhmmss)
забиваем это в цикл
и там с помощью цикла и перевода в текст подсчитываем кол-во цифр

Добавлено через 1 час 20 минут
нужна помощь
вроде составил программу
нужна помощь в отладке и поиске ошибок
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
Program Chas;
 
Uses CRT;
 
Var
time1,time2,time_now_str,i_str:string;
h1,h11,h12,h2,h21,h22,m1,m11,m12,m2,m21,m22,s1,s11,s12,s2,s21,s22:byte;
a:array[1..10] of integer;
i,i1,i2,time_start,time_now,time_end,time_now_vol:integer;
h_now,m_now,s_now:byte;
 
begin
 
 
 
 
readln(time1);
readln(time2);
  {ўўҐ«Ё **з*«м*лҐ §**зҐ*Ёп}
 
for i:=1 to 10 do
a[i]:=0;
 
   {§*ЎЁ«Ё *г«п¬Ё}
 
val(time1[1],h11,i);
val(time1[2],h12,i);
h1:=10*h11+h12;
 
val(time1[4],m11,i);
val(time1[5],m12,i);
m1:=10*m11+m12;
 
val(time1[7],s11,i);
val(time1[8],s12,i);
s1:=10*s11+s12;
 
 {‘¤Ґ«*«Ё 1 зЁб«®}
 
val(time2[1],h21,i);
val(time2[2],h22,i);
h2:=10*h21+h22;
 
{writeln(time2[1],time2[2]);}
 
val(time2[4],m21,i);
val(time2[5],m22,i);
m2:=10*m21+m22;
 
val(time2[7],s21,i);
val(time2[8],s22,i);
s2:=10*s21+s22;
 
 {‘¤Ґ«*«Ё 2 зЁб«®}
 
{writeln(h1,'*3600+',m1,'*60+',s1,'=',h1*3600+m1*60+s1,'   ',h2,m2,s2);}
{zdes' esche pravilno}
 
time_start:=h1*3600+m1*60+s1;
time_end:=h2*3600+m2*60+s2;
 
writeln(time_start,' - ',time_end);{ zdes' yzhe net}
 
{time_now:=time start;
while time_now<time_end do
begin
     for
end;}
 
for i1:=time_start to time_end do
    begin
         time_now:=i1;
 
 
         {writeln(time_now);}
 
 
         h_now:=time_now div 3600;
         m_now:=(time_now-h_now*3600) div 60;
         s_now:=time_now mod 60;
         time_now_vol:=h_now*10000+m_now*100+s_now;
         str(time_now_vol,time_now_str);
 
         {writeln(time_now_str)}
 
         for i:=1 to 10 do
              begin
                   i2:=i-1;
                   str(i2,i_str);
                   if time_now_str[1]=i_str then a[i]:=a[i]+1;
                   if time_now_str[2]=i_str then a[i]:=a[i]+1;
                   if time_now_str[3]=i_str then a[i]:=a[i]+1;
                   if time_now_str[4]=i_str then a[i]:=a[i]+1;
                   if time_now_str[5]=i_str then a[i]:=a[i]+1;
                   if time_now_str[6]=i_str then a[i]:=a[i]+1;
              end;
 
    end;
 
 
 {‚лў®¤ аҐиҐ*Ёп}
 
for i:=1 to 10 do
writeln(a[i]);
writeln('Dlja prodolzhenija nazhmite ljubuju klavishu');
while not keypressed do
end.
комментарии в кодировке cp866(дос)
0
Эксперт по компьютерным сетямЭксперт Pascal/Delphi
4190 / 1291 / 237
Регистрация: 27.07.2009
Сообщений: 3,962
14.10.2009, 22:53 9
хмм... по-моему можно уложиться в три вложенных цикла в каждом из которых подсчитывать цифры.
0
Эксперт С++
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
14.10.2009, 23:11 10
Зачем в строки ?
Можно прямо так и считать - три целых hour, minutes, seconds.
Алогоритм перехода по секундам нетрудно сделать.

Для ускорения алгоритма еще можно вычислить сколько цифр в произвольной минуте
то есть от XX:YY:00 до XX:YY:59

И сколько цифр в произвольном часе
то есть от XX:00:00 до XX:59:59

Тогда вообще будет быстро считать.
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
15.10.2009, 07:21  [ТС] 11
если делать не через строки, то придется более сложный алгоритм делать
возникла другая проблема
числа Time_now,time_end,time_start переставил в longint
возникла другая проблема
например, считаем
Pascal
1
time_start:=h1*3600+m1*60+s1;
почему то из ответа он вычитает 64к
считаю сам - число выходят всегда на 65 536 больше
0
Эксперт С++
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
15.10.2009, 08:10 12
если делать не через строки, то придется более сложный алгоритм делать
Что так, что эта - не сложнее.

считаю сам - число выходят всегда на 65 536 больше
Телепаты отдыхают.
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
15.10.2009, 15:35  [ТС] 13
я перевожу введенное время в секунды
раздел описаний
Pascal
1
time_start,time_now,time_end,time_now_vol:longint;
код выполнения операции
Pascal
1
time_start:=h1*3600+m1*60+s1;
если число в секундах получается больше 32*1024 он отнимает 64*1024

если у кого есть варианты, как решить задачу другим способам, приветствую их выкладывание
0
Эксперт С++
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
15.10.2009, 20:52 14
если число в секундах получается больше 32*1024 он отнимает 64*1024
Такое может быть только если у тебя там не longint, а двубайтное целое !
Двубайтное целое как раз и есть 64*1024 в пределе.
Если со знаком - то 32*1024.

Ты привел только пару строк код - так что телепаты опять отдыхают - понять где ты именно ошибся невозможно.
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
15.10.2009, 21:05  [ТС] 15
если текста программы в посте 8 этой темы мало - выкладываю новый код, с сегодняшними поправками
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Program Chas;
 
Uses CRT;
 
Var
time1,time2,time_now_str,i_str:string;
h1,h11,h12,h2,h21,h22,m1,m11,m12,m2,m21,m22,s1,s11,s12,s2,s21,s22:byte;
a:array[1..10] of integer;
i:integer;
i1,i2:longint;
time_start,time_now,time_end,time_now_vol:longint;
h_now,m_now,s_now:byte;
 
begin
 
 
 
 
readln(time1);
readln(time2);
  {ўўҐ«Ё **з*«м*лҐ §**зҐ*Ёп}
 
for i:=1 to 10 do
a[i]:=0;
 
   {§*ЎЁ«Ё *г«п¬Ё}
 
val(time1[1],h11,i);
val(time1[2],h12,i);
h1:=10*h11+h12;
 
val(time1[4],m11,i);
val(time1[5],m12,i);
m1:=10*m11+m12;
 
val(time1[7],s11,i);
val(time1[8],s12,i);
s1:=10*s11+s12;
 
 {‘¤Ґ«*«Ё 1 зЁб«®}
 
val(time2[1],h21,i);
val(time2[2],h22,i);
h2:=10*h21+h22;
 
{writeln(time2[1],time2[2]);}
 
val(time2[4],m21,i);
val(time2[5],m22,i);
m2:=10*m21+m22;
 
val(time2[7],s21,i);
val(time2[8],s22,i);
s2:=10*s21+s22;
 
 {‘¤Ґ«*«Ё 2 зЁб«®}
 
{writeln(h1,'*3600+',m1,'*60+',s1,'=',h1*3600+m1*60+s1,'   ',h2,m2,s);}
{zdes' esche pravilno}
 
time_start:=h1*3600+m1*60+s1;
time_end:=h2*3600+m2*60+s2;
 
writeln(time_start,' - ',time_end);{ zdes' yzhe net}
 
 
 
for i1:=time_start to time_end do
    begin
         time_now:=i1;
 
 
         {writeln(time_now);}
         
 
         h_now:=time_now div 3600;
         m_now:=(time_now-h_now*3600) div 60;
         s_now:=time_now mod 60;
         time_now_vol:=h_now*10000+m_now*100+s_now;
         writeln(time_now_vol);
         str(time_now_vol,time_now_str);
         
         {writeln(time_now_str)}
 
         for i:=1 to 10 do
              begin
                   i2:=i-1;
                   str(i2,i_str);
                   if time_now_str[1]=i_str then a[i]:=a[i]+1;
                   if time_now_str[2]=i_str then a[i]:=a[i]+1;
                   if time_now_str[3]=i_str then a[i]:=a[i]+1;
                   if time_now_str[4]=i_str then a[i]:=a[i]+1;
                   if time_now_str[5]=i_str then a[i]:=a[i]+1;
                   if time_now_str[6]=i_str then a[i]:=a[i]+1;
              end;
 
    end;
 
 
 {‚лў®¤ аҐиҐ*Ёп}
 
for i:=1 to 10 do
writeln(a[i]);
writeln('Dlja prodolzhenija nazhmite ljubuju klavishu');
while not keypressed do
end.
проблема получается с time_start и time_end
хоть они и longint
0
Эксперт С++
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
16.10.2009, 12:09 16
Pascal
1
2
h1,h11,h12,h2,h21,h22,m1,m11,m12,m2,m21,m22,s1,s11,s12,s2,s21,s22:byte;
h_now,m_now,s_now:byte;
Вот зачем тут byte ?
Сделай везде longint - глядишь и глюк пропадет.
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
16.10.2009, 14:38  [ТС] 17
первая строка
буквы с одиночными индексами (h1,m1.s2...) используются для обозначения входящего времени
с двойным индексом - соответственно цифры из строки берутся
если покажешь, как можно делать из определенных букв строки выражение-буду благодарен

во второй строке считается время в цикла, чтобы представить его в виде hhmmss


/UPD
исправил все на longint
считать стал правильно
причем эффект появился от исправления второй строки, которую Вы указали
*удивлен*
0
2 / 2 / 0
Регистрация: 30.09.2009
Сообщений: 28
16.10.2009, 16:46  [ТС] 18
хотя понял, почему так получалось
он проводит вычисления у минут, когда ему выделяют 1 байт
а для времени надо 4, ну или, по крайней мере, 3
поэтому у него в начале переполнение


вывод-используйте longint или int64(в дельфи) и будет вам счастье без переполнения
0
Эксперт С++
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
17.10.2009, 18:24 19
Достаточно просто всегда использовать int, кроме двух случаев.
Первый случай - когда прямо нужно использовать byte
И второй случай - когда прямо вот совсем нужно использовать longint
0
17.10.2009, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2009, 18:24
Помогаю со студенческими работами здесь

Подсчет количества цифр числа + приближение числа Пи ф-лой Борвейна
Уважаемые форумчане, была бы очень признательна, если бы кто-нибудь мне помог определить, что я...

Подсчет количества слов в файле
Напишите программу, которая считает количество слов в файле input.txt . Словом называется...

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

Подсчет количества чисел в диапозоне...
Вводятся ненулевые целые числа, конец ввода - число 0. Подсчитать количество чисел вне диапазона ....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru