Форум программистов, компьютерный форум CyberForum.ru

Минимальное число - C++

Восстановить пароль Регистрация
 
Даня98
 Аватар для Даня98
27 / 27 / 8
Регистрация: 13.02.2010
Сообщений: 145
21.10.2011, 19:46     Минимальное число #1
Есть задача, ее условие

условие
Требуется написать программу, которая из цифр двух натуральных чисел создает наименьшее возможное число, сохраняя при этом порядок следования цифр в этих числах.
Входные данные

Входной файл INPUT.TXT содержит два натуральных числа, записанных в двух строках. Числа больше нуля и меньше 10255.

Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести наименьшее возможное число, удовлетворяющее условию задачи.

Но не проходит несколько тестов - неправльная идея решения. Можете помочь с идеей?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
21.10.2011, 19:49     Минимальное число #2
А какая у вас идея? мы покритикуем,е сли вы ее изложите и поможем улучшить.
Надеюсь, вы сразу используете строки для хранения своих чисел, а не целые типы?
Даня98
 Аватар для Даня98
27 / 27 / 8
Регистрация: 13.02.2010
Сообщений: 145
21.10.2011, 19:56  [ТС]     Минимальное число #3
Цитата Сообщение от aeshes Посмотреть сообщение
Надеюсь, вы сразу используете строки для хранения своих чисел, а не целые типы?
конечно. у меня контр пример есть, но если я меняю программу,то решение все равно неправильное. Ну идея у меня такая: перебираю по порядку все числа второго числа, если у первого числа на позиции x стоит цифра больше чем цифра 2 числа (к), то я увеличиваю позицию, куда вставлять цифру и т.д.

Добавлено через 25 секунд
Цитата Сообщение от aeshes Посмотреть сообщение
мы покритикуем
да критиковать не надо =)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2011, 20:04     Минимальное число #4
Хм... Если я правильно понял задание, то вот, набросок накидал.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char a[] = "1351", b[] = "246";
    int posA = 0, posB = 0;
    while((posA < strlen(a)) && (posB < strlen(b)))
    {
        if(a[posA] < b[posB])
            printf("%c", a[posA++]);
        else
            printf("%c", b[posB++]);
    }
    if(posA == strlen(a))
        for( ; posB < strlen(b); ++posB)
            printf("%c", b[posB]);
    else
        for( ; posA < strlen(a); ++posA)
            printf("%c", a[posA]);
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от Даня98 Посмотреть сообщение
да критиковать не надо =)
Ну что же вы, мы не волки. А конструктивная критика никому не помешает.
Даня98
 Аватар для Даня98
27 / 27 / 8
Регистрация: 13.02.2010
Сообщений: 145
21.10.2011, 20:07  [ТС]     Минимальное число #5
прошло так-же, как у меня.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2011, 20:11     Минимальное число #6
Мой код можно сразу же забраковать при комбинации 321 123.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.10.2011, 22:46     Минимальное число #7
Даня98,
На мой взгляд самый "трудный" тест в этой задаче это такой:
555555552
555555554
или
555555554
555555552

выкладываю код, который прошел все тесты (сейчас не помню, но может быть там есть что-то лишнее - захотите разберетесь):
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
#include <stdio.h>
#include <string.h>
char str[260], str1[260];
 
int main( ) {
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout); 
  int i=0, i1=0, len, len1;
  scanf("%s", &str);
  scanf("%s", &str1);
  len=(int)strlen(str);
  len1=(int)strlen(str1);
  while(true)
  {
      if(i==len || i1==len1)
      {
          for(; i<len; i++)
              printf("%c", str[i]);
          for(; i1<len1; i1++)
              printf("%c", str1[i1]);
          break;
      }
      if(str[i]<str1[i1])
      {
          printf("%c", str[i++]);
      }
      else
      {
          if(str[i]>str1[i1])
              printf("%c", str1[i1++]);
          else
          {
              int fl=1;
              for(int j=1; j+i<len && j+i1<len1 && fl==1; j++)
              {
                  if(str[i+j]<str1[i1+j])
                      fl=2;
                  if(str[i+j]>str1[i1+j])
                      fl=3;
              }
              if(fl==1)
              {
                  if(j+i==len)
                  {
                      for(int y=j; y+i1<len1 && fl==1; y++)
                      {
                          if(str[len-1]<str1[i1+y])
                              fl=2;
                          if(str[len-1]>str1[i1+y])
                              fl=3;
                      }
                  }
                  if(j+i1==len1)
                  {
                      for(int y=j; y+i<len1 && fl==1; y++)
                      {
                          if(str1[len1-1]<str[i+y])
                              fl=3;
                          if(str1[len1-1]>str[i+y])
                              fl=2;
                      }
                  }
 
              }
              if(fl==1 || fl==2)
              {
                  printf("%c", str[i++]);
              }
              else
                  printf("%c", str1[i1++]);
          }
      }
  }
  
 
  return 0;
 
 }
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.10.2011, 00:11     Минимальное число #8
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
#include <stdio.h>
 
#define MAX_LEN 255
#define READ_MASK "%255s"
 
void sorted_split(const char * a, const char * b, char * buf){
    if ( ! *a ){
        if ( ! *b )
            *buf = 0;
        else {
            *buf++ = *b++;
            sorted_split(a, b, buf);
        }
    }
    else {
        if ( ! *b ){
            *buf++ = *a++;
            sorted_split(a, b, buf);
        }
        else {
            if ( *a < *b )
                *buf++ = *a++;
            else
                *buf++ = *b++;
            sorted_split(a, b, buf);
        }
    }
}
 
int main(void){
    char a[MAX_LEN + 1], b[MAX_LEN + 1], buf[MAX_LEN * 2 + 1];
    
    while ( printf("A = ") && scanf(READ_MASK, a) == 1 && printf("B = ") && scanf(READ_MASK, b) == 1 ){
        sorted_split(a, b, buf);
        printf("Result: %s\n", buf);
    }
    
    return 0;
}
jds_07
27 / 26 / 1
Регистрация: 12.03.2009
Сообщений: 85
03.11.2011, 15:21     Минимальное число #9
Цитата Сообщение от 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
#include <stdio.h>
 
#define MAX_LEN 255
#define READ_MASK "%255s"
 
void sorted_split(const char * a, const char * b, char * buf){
    if ( ! *a ){
        if ( ! *b )
            *buf = 0;
        else {
            *buf++ = *b++;
            sorted_split(a, b, buf);
        }
    }
    else {
        if ( ! *b ){
            *buf++ = *a++;
            sorted_split(a, b, buf);
        }
        else {
            if ( *a < *b )
                *buf++ = *a++;
            else
                *buf++ = *b++;
            sorted_split(a, b, buf);
        }
    }
}
 
int main(void){
    char a[MAX_LEN + 1], b[MAX_LEN + 1], buf[MAX_LEN * 2 + 1];
    
    while ( printf("A = ") && scanf(READ_MASK, a) == 1 && printf("B = ") && scanf(READ_MASK, b) == 1 ){
        sorted_split(a, b, buf);
        printf("Result: %s\n", buf);
    }
    
    return 0;
}
Не правильно решил. Попробуй задать: 94 95 должно быть: 9495
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2011, 15:43     Минимальное число
Еще ссылки по теме:

C++ максимальное и минимальное число
Вычислить за минимальное число операций C++
Минимальное положительное целое число C++

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.11.2011, 15:43     Минимальное число #10
А у меня такой быдлокод получился =(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <fstream>
char f[257], s[257], r[513], *a = f, *b = s, *c = r, *x, *y;
int main(){
    for (std::fstream("input.txt") >> f >> s ;*a || *b; )
        if (*a - *b) 
            *c++ = !*b ||  *a && *a < *b  ? *a++ : *b++;
        else {
            for (x = a, y = b; *++x == *++y; );
            *c++ = !*y || *x && *x < *y ? *a++ : *b++;
            }
    std::ofstream o("output.txt");
    o << r;
}
Yandex
Объявления
03.11.2011, 15:43     Минимальное число
Ответ Создать тему
Опции темы

Текущее время: 19:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru