Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
1

Как разбить число

17.10.2017, 23:25. Показов 515. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Решаю одну задачку, пишу по ней программу, никак не получается разбить число, на годы, месяцы и дни. Число любое, допустим 749. В нем должно быть столько то лет, столько то месяцев, и столько то дней. До года, я как-то справился, а вот больше года, никак не выходит.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2017, 23:25
Ответы с готовыми решениями:

Как разбить 64 битное число на 2 числа по 32 бита?
Здравствуйте, как разбить 64 битное число на 2 числа по 32 бита? Добавлено через 7 минут Я...

Как разбить число на цифры и вывести в консоль без массивов?
Подскажите алгоритм.

Как разбить число?
Прошу прощения если эта тема была. Делаю программу но вот работодатель пожелал чтобы было так....

Как разбить число на составляющие
Подскажіте пожалуйста хоть в каком направлении копать задача состоит в том что есть какоето число...

13
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
17.10.2017, 23:33 2
Цитата Сообщение от LightProger Посмотреть сообщение
Число любое, допустим 749
749 чего? попугаев?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.10.2017, 23:43 3
Например: создаём массив, содержащий число дней в каждом месяце. Суммируем массив с первого месяца, пока сумма меньше числа дней. Дальше всё просто.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12456 / 7480 / 1753
Регистрация: 25.07.2009
Сообщений: 13,759
18.10.2017, 01:35 4
Цитата Сообщение от LightProger Посмотреть сообщение
До года, я как-то справился
Сомневаюсь, если честно. Либо в условии должно быть что-то вроде "Все года считать не високосными", либо задача имеет несколько решений.
0
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
18.10.2017, 04:18  [ТС] 5
Jewbacabra, дней

Добавлено через 3 минуты
easybudda, как-то так:
C
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#include <stdio.h>
/* **********************************************
 * Получает на вход целое число и выводит строку:
 *          "До отпуска: x день/дня/дней."
 * Работает для любых значений.
 *
 * Измените программу таким образом, чтобы она
 * подсчитывала еще и количество месяцев и лет,
 * т.е. при вводе числа 615, вывод должен быть:
 * До отпуска: 1 год, 8 месяцев и 10 дней.
 *
 * На вход может поступить число, при котором
 * понадобится уточнять написание:
 * 1 год/ 3 года / 6 лет, но не более 60 лет.
 * То же касается и месяцев.
 *
 * Предполагается, что в каждом году 365 дней.
 * А в каждом месяце - 30 дней.
 * *********************************************/
 
typedef char* StriNg;               // объявляем новый тип string
int Days (int);                     // номер элемента массива s[]
int LastDouble (int);               // две последние цифры числа
int Year (int);
int Month (int);
 
int main (void)
{
  StriNg s[3] = {"день", "дня", "дней"};
  StriNg year[3] = {"год", "года", "лет"};
  StriNg mon[3] = {"месяц", "месяца", "месяцев"};
  StriNg message = "Сколько дней до отпуска?:";
 
  // ввод числа
  int n;
  int restYears, restDays, restMonth, a;
 
  do{
      printf("%s ", message);
      scanf("%d", &n);
      getchar();
    }while(n < 0);
 
  //разделение на годы, месяцы и дни
  // если года кратны 365, выводим только год
  if(n % 365 == 0)
    {
      restYears = n / 365;
 
      // вывод
      printf("До отпуска: %i %s.\n", restYears, year[Year(restYears)]);
    }
  else
    {
      // если число больше нуля и меньше или равно 30, выводим только дни
      if(n > 0 && n <= 30)
        {
          // вывод
          printf("До отпуска: %i %s.\n", n, s[Days(n)]);
        }
      // выводим, дни и месяцы
      if( n > 30 && n < 365)
        {
          restMonth = n / 30;
          restDays = n % 30;
 
          // вывод
          printf("До отпуска: %i %s %i %s.\n", restMonth, mon[Month(restMonth)], restDays, s[Days(restDays)]);
        }
 
      // выводим годы + дни
      if(n % 365)
        {
 
 
          // вывод
          printf("До отпуска: %i %s %i %s.\n", restYears, year[Year(restYears)], restDays, s[Days (restDays)]);
        }
 
          // выводим годы + месяцы
          if (   )
            {
 
 
                  // вывод
                  printf("До отпуска: %i %s %i %s.\n", restYears, year[Year(restYears)], restMonth,
                         mon[Month (restMonth)]);
            }
 
      // выводим годы + месяцы + дни
      if (    )
        {
 
 
          // вывод
          printf("До отпуска: %i %s %i %s %i %s.\n", restYears, year[Year(restYears)], restMonth,
                 mon[Month (restMonth)], restDays, s[Days (restDays)]);
        }
    }
  return 0;
}
//-------------------------------------------------------------------------
// номер элемента массива year[] для любых значений y
//-------------------------------------------------------------------------
int Year (int y)
{
  int answer, k;            /* answer: 0 - лет, 1 - год, 2 - года */
  if (y > 0)
    {
      if (y < 100)
        {
          k = y % 10;
          if (y < 20)
            {
              if (y > 4) answer = 2;
              else
                {
                  if (y == 1) answer = 0;
                  if (y > 1) answer = 1;
                }
            }
          else if (!k) answer = 2;
          else
            {
              if (k == 1) answer = 0;
              else if (k > 1 && k < 5) answer = 1;
              else answer = 2;
            }
        }
      else answer = Year(LastDouble(y));
    }
  else answer = 2;
  return answer;
}
//-------------------------------------------------------------------------
// номер элемента массива mon[] для любых значений m
//-------------------------------------------------------------------------
int Month (int m)
{
  int answer, k;            /* answer: 0 - месяцев, 1 - месяц, 2 - месяца */
  if (m > 0)
    {
      if (m < 100)
        {
          k = m % 10;
          if (m < 20)
            {
              if (m > 4) answer = 2;
              else
                {
                  if (m == 1) answer = 0;
                  if (m > 1) answer = 1;
                }
            }
          else if (!k) answer = 2;
          else
            {
              if (k == 1) answer = 0;
              else if (k > 1 && k < 5) answer = 1;
              else answer = 2;
            }
        }
      else answer = Month(LastDouble(m));
    }
  else answer = 2;
  return answer;
}
//-------------------------------------------------------------------------
// номер элемента массива s[] для любых значений num
//-------------------------------------------------------------------------
int Days (int num)
{
  int answer, m;            /* answer: 0 - день, 1 - дня, 2 - дней */
  if (num > 0)
    {
      if (num < 100)
        {
          m = num % 10;
          if (num < 20)
            {
              if (num > 4) answer = 2;
              else
                {
                  if (num == 1) answer = 0;
                  if (num > 1) answer = 1;
                }
            }
          else if (!m) answer = 2;
          else
            {
              if (m == 1) answer = 0;
              else if (m > 1 && m < 5) answer = 1;
              else answer = 2;
            }
        }
      else answer = Days(LastDouble(num));
    }
  else answer = 2;
  return answer;
}
//-------------------------------------------------------------------------
//возвращает две последние цифры числа
//-------------------------------------------------------------------------
int LastDouble (int z)
{
  int a, b, c;
  b = z % 10;
  z /= 10;
  a = z % 10;
  c = (a * 10) + b;
  return c;
}
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
18.10.2017, 06:48 6
Если не учитывать високосность
C
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
#include <stdio.h>
 
// Високосные годы НЕ учитываются!
void decompose(int days)
{
    int fullYears = days / 365;
    days %= 365;
 
    const int daysInMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int i, s, sNext = 0;
 
    for (i = 0; sNext <= days; i++) {
        s = sNext;
        sNext += daysInMonth[i];
    }
 
    int fullMonths = i-1;
    days -= s;
 
    printf("%d %d %d\n", fullYears, fullMonths, days);
}
 
int main()
{
    decompose(365*3 + 256); // 256-й день в году - 13 сентября - день программиста
    decompose(365*2 + 31+28+31+5); // должно вывести 2 3 5
    decompose(5*365 - 1); // 4 11 30
}
0
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
18.10.2017, 10:24 7
LightProger, имхо, задача поставлена неправильно. Ибо невозможно однозначно посчитать то что Вам надо, из за високосных годов.
Если есть 2 даты, можно подсчитать между ними разницу. Если есть хоть одна дата, то можно к ней прибавить/из неё вычесть какое.-то количество дней/месяцев/лет.
Но по любому нужна "точка отправки".
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.10.2017, 13:07 8
LightProger, дошло. Но тогда как сказали выше без дополнительных условий нельзя посчитать, число дней в месяце не постояно.
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
18.10.2017, 14:28 9
да можно вручную перебрать все эти 749 дней. Просто заводим цикл и проматываем дни, если n(в начале n = 0, параллельно с n возьмём ещё k которая будет показывать общее колво дней и когда k будет равен 749 останавливаем цикл) стал равным 31 и если считать что отсчёт шел с января то к переменной месяц прибавляем 1 а день обнуляем и когда наберётся 12 месяцев к счётчику ГОД прибавляем 1 а месяцы обнуляем и так пока k != 749
0
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
18.10.2017, 14:50 10
no swear, можно предположить, что начинаешь с января, а год то какой, високосный или нет? Предположить и это можно, но имхо, смысл весь теряется.

Не по теме:

Типа "мой календарь" работает только от Х года и до ? года"...

0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
18.10.2017, 15:05 11
Цитата Сообщение от Kukstyler Посмотреть сообщение
начинаешь с января, а год то какой, високосный или нет?
Ну это уже зависит от условия задачи. Я сказал общий вариант решения.
0
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
18.10.2017, 15:16  [ТС] 12
Kukstyler, В условии задачи не сказано, учитывать или не учитывать високосный год, просто сказано, что год равняется 365 дней и месяц равняется 30 дням. Посидел на работе, подумал, с напарником решшили эту задачу, на бумажке, домой принес, написал по ней код. Поставленную задачу - решил!
C
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <stdio.h>
/* **********************************************
 * Получает на вход целое число и выводит строку:
 *          "До отпуска: x день/дня/дней."
 * Работает для любых значений.
 *
 * Измените программу таким образом, чтобы она
 * подсчитывала еще и количество месяцев и лет,
 * т.е. при вводе числа 615, вывод должен быть:
 * До отпуска: 1 год, 8 месяцев и 10 дней.
 *
 * На вход может поступить число, при котором
 * понадобится уточнять написание:
 * 1 год/ 3 года / 6 лет, но не более 60 лет.
 * То же касается и месяцев.
 *
 * Предполагается, что в каждом году 365 дней.
 * А в каждом месяце - 30 дней.
 * *********************************************/
 
typedef char* StriNg;               // объявляем новый тип string
int Days (int);                     // номер элемента массива s[]
int LastDouble (int);               // две последние цифры числа
 
int main (void)
{
  StriNg s[3] = {"день", "дня", "дней"};
  StriNg year[3] = {"год", "года", "лет"};
  StriNg mon[3] = {"месяц", "месяца", "месяцев"};
  StriNg message = "Сколько дней до отпуска?:";
 
  // ввод числа
  int n;
  int restYears, restDays, restMonth, total, a;
 
  total = 365 * 60;  // вычисляем лимит в 60 лет
 
  do{
      printf("%s ", message);
      scanf("%d", &n);
      getchar();
    }while(n < 0 || n > total);
 
  // разбиваем число на годы, месяцы и дни
  restYears = n / 365;
  a = n - restYears * 365;
  restMonth = a / 30;
  restDays = a - restMonth * 30;
 
  // если число равно 0, то вывести дней
  if(n == 0) { printf("До отпуска: %i %s.\n", restDays, s[Days (restDays)]); }
 
  // если года кратны 365, выводим только год
  else if(n % 365 == 0)
    {
      printf("До отпуска: %i %s.\n", restYears, year[Days (restYears)]);
    }
    // если число больше нуля и меньше или равно 30, выводим только дни
  else if(n > 0 && n <= 30)
        {
          printf("До отпуска: %i %s.\n", n, s[Days(n)]);
        }
    // выводим, дни и месяцы
  else if( n > 30 && n < 365)
        {
          restMonth = n / 30;
          restDays = n % 30;
          printf("До отпуска: %i %s %i %s.\n", restMonth, mon[Days (restMonth)],
                 restDays, s[Days(restDays)]);
        }
 
    // выводим годы + дни
  else if(restYears > 0 && restMonth == 0 && restDays > 0)
        {
          printf("До отпуска: %i %s %i %s.\n", restYears, year[Days (restYears)],
                 restDays, s[Days (restDays)]);
        }
    // выводим годы + месяцы
  else if (restYears > 0 && restMonth > 0 && restDays == 0)
            {
              printf("До отпуска: %i %s %i %s.\n", restYears, year[Days (restYears)], restMonth,
                     mon[Days (restMonth)]);
            }
    // выводим годы + месяцы + дни
  else
    {
      if(restYears > 0 && restMonth > 0 && restDays > 0)
        {
          printf("До отпуска: %i %s %i %s %i %s.\n", restYears, year[Days (restYears)], restMonth,
                 mon[Days (restMonth)], restDays, s[Days (restDays)]);
        }
    }
 
  return 0;
}
//-------------------------------------------------------------------------
// номер элемента массива s[] для любых значений num
//-------------------------------------------------------------------------
int Days (int num)
{
  int answer, m;            /* answer: 0 - 1 элемент массива, 1 - 2 элемент, 2 - 3 элемент */
  if (num > 0)
    {
      if (num < 100)
        {
          m = num % 10;
          if (num < 20)
            {
              if (num > 4) answer = 2;
              else
                {
                  if (num == 1) answer = 0;
                  if (num > 1) answer = 1;
                }
            }
          else if (!m) answer = 2;
          else
            {
              if (m == 1) answer = 0;
              else if (m > 1 && m < 5) answer = 1;
              else answer = 2;
            }
        }
      else answer = Days(LastDouble(num));
    }
  else answer = 2;
  return answer;
}
//-------------------------------------------------------------------------
//возвращает две последние цифры числа
//-------------------------------------------------------------------------
int LastDouble (int z)
{
  int a, b, c;
  b = z % 10;
  z /= 10;
  a = z % 10;
  c = (a * 10) + b;
  return c;
}
0
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
18.10.2017, 15:26 13

Не по теме:

Цитата Сообщение от LightProger Посмотреть сообщение
Поставленную задачу - решил!
Ну и ладушки :)



Добавлено через 6 минут

Не по теме:

Цитата Сообщение от no swear Посмотреть сообщение
Ну это уже зависит от условия задачи.
Имхо, условия задачи дебильные. Ибо, даты есть даты, и у них есть свои свойства которые надо учитывать - иначе задача не про даты а про что-то другое. Помидор, но синий и с одной большой косточкой уже не помидор. :D

0
41 / 41 / 15
Регистрация: 29.12.2016
Сообщений: 291
18.10.2017, 16:51  [ТС] 14
Доработал немого программу...
C
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdio.h>
/* **********************************************
 * Получает на вход целое число и выводит строку:
 *          "До отпуска: x день/дня/дней."
 * Работает для любых значений.
 *
 * Измените программу таким образом, чтобы она
 * подсчитывала еще и количество месяцев и лет,
 * т.е. при вводе числа 615, вывод должен быть:
 * До отпуска: 1 год, 8 месяцев и 10 дней.
 *
 * На вход может поступить число, при котором
 * понадобится уточнять написание:
 * 1 год/ 3 года / 6 лет, но не более 60 лет.
 * То же касается и месяцев.
 *
 * Предполагается, что в каждом году 365 дней.
 * А в каждом месяце - 30 дней.
 * *********************************************/
 
typedef char* StriNg;               // объявляем новый тип string
int Days (int);                     // номер элемента массива s[]
int LastDouble (int);               // две последние цифры числа
 
int main (void)
{
  StriNg s[3] = {"день", "дня", "дней"};
  StriNg year[3] = {"год", "года", "лет"};
  StriNg mon[3] = {"месяц", "месяца", "месяцев"};
  StriNg message = "Сколько дней до отпуска?:";
 
  // ввод числа
  int n;
  int restYears, restDays, restMonth, total, a;
 
  total = 365 * 60;  // вычисляем лимит в 60 лет
 
  do{
      printf("%s ", message);
      scanf("%d", &n);
      getchar();
    }while(n < 0 || n > total);
 
  // разбиваем число на годы, месяцы и дни
  restYears = n / 365;
  a = n - restYears * 365;
  restMonth = a / 30;
  restDays = a - restMonth * 30;
 
  // если число равно 0, то вывести дней
  if(n == 0) { printf("До отпуска: %i %s.\n", restDays, s[Days (restDays)]); }
 
  // если года кратны 365, выводим только год
  else if(n % 365 == 0)
    {
      printf("До отпуска: %i %s.\n", restYears, year[Days (restYears)]);
    }
 
    // если число кратно 30, то выводим только месяц
  else if(n % 30 == 0) { printf("До отпуска: %i %s.\n", restMonth, mon[Days (restMonth)]);}
 
    // если число меньше  30, выводим только дни
  else if(restYears == 0 && restMonth == 0 && restDays < 30)
    {
      printf("До отпуска: %i %s.\n", n, s[Days(n)]);
    }
 
    // выводим, дни и месяцы
  else if(restDays < 30 && restMonth < 12 && restYears == 0)
    {
      printf("До отпуска: %i %s %i %s.\n", restMonth, mon[Days (restMonth)],
                 restDays, s[Days(restDays)]);
    }
 
    // выводим годы + дни
  else if(restYears > 0 && restMonth == 0 && restDays > 0)
    {
      printf("До отпуска: %i %s %i %s.\n", restYears, year[Days (restYears)],
                 restDays, s[Days (restDays)]);
    }
 
    // выводим годы + месяцы
  else if (restYears > 0 && restMonth > 0 && restDays == 0)
    {
      printf("До отпуска: %i %s %i %s.\n", restYears, year[Days (restYears)], restMonth,
                     mon[Days (restMonth)]);
    }
    // выводим годы + месяцы + дни
  else
    {
      if(restYears > 0 && restMonth > 0 && restDays > 0)
        {
          printf("До отпуска: %i %s %i %s %i %s.\n", restYears, year[Days (restYears)], restMonth,
                 mon[Days (restMonth)], restDays, s[Days (restDays)]);
        }
    }
 
  return 0;
}
//-------------------------------------------------------------------------
// номер элемента массива s[] для любых значений num
//-------------------------------------------------------------------------
int Days (int num)
{
  int answer, m;            /* answer: 0 - 1 элемент массива, 1 - 2 элемент, 2 - 3 элемент */
  if (num > 0)
    {
      if (num < 100)
        {
          m = num % 10;
          if (num < 20)
            {
              if (num > 4) answer = 2;
              else
                {
                  if (num == 1) answer = 0;
                  if (num > 1) answer = 1;
                }
            }
          else if (!m) answer = 2;
          else
            {
              if (m == 1) answer = 0;
              else if (m > 1 && m < 5) answer = 1;
              else answer = 2;
            }
        }
      else answer = Days(LastDouble(num));
    }
  else answer = 2;
  return answer;
}
//-------------------------------------------------------------------------
//возвращает две последние цифры числа
//-------------------------------------------------------------------------
int LastDouble (int z)
{
  int a, b, c;
  b = z % 10;
  z /= 10;
  a = z % 10;
  c = (a * 10) + b;
  return c;
}
0
18.10.2017, 16:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2017, 16:51
Помогаю со студенческими работами здесь

Как разбить число на цифры.
Задача: Узнать, входит ли в введённое число n цифра 3? Мне не надо писать саму программу. Мне...

Как разбить число на массив?
Здравствуйте! У меня есть число 3, которое нужно разбить на массив от 1 до 3. Как это...

Как разбить число на цифры?
Всем доброго времени суток . я новичок в java . подскажите пожалуйста как разбить целое число на ...

Как разбить число во временном формате?
Привет всем! Подскажите плиз, числа в формате время, к примеру 21:05:00 - 23:10:15, как сравнить...


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

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