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

Задача: преобразование систем счисления - C++

Восстановить пароль Регистрация
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
19.09.2012, 11:57     Задача: преобразование систем счисления #1
Описание

Имеются 2 цифры в разных системах счисления, цель задачи найти, в каких системах счисления 2 цифры равны. Например, 12 и 5, в десятичной системе счисления они не равны, но 12 в 3-чной системе счисления и 5 в 6-чной или десятичной системе счисления равны между собой.

Input

Вводятся два числа M и N ( которые в десятичной системе не превышают 1000000000), системы счисления находятся в диапазоне 2~36. Для чисел меньше 10 использовать цифры 0~9, для чисел больше 10 использовать заглавные буквы A~Z.

Output

Вывести в каких системах счисления M и N равны. Если равны, вывести соответствующий результат (если результатов несколько, вывести тот результат, в котором система счисления наименьшая), если не равны, вывести ошибку.

Например, Input:
12 5↵

Output:
12 (base 3) = 5 (base 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>
#include <stdlib.h>
#include <string.h>
 
int check (char m1[256], char n1[256])
{
  int i, j;
  for (i=2; i<=36; i++)
  for (j=2; j<=36; j++) if (strtol( m1, NULL, i ) == strtol( n1, NULL, j )) { printf ("%s (base %d) = %s (base %d)\n", m1, i, n1, j); return 1; }
  printf("%s is not equal to %s in any base 2..36\n", m1, n1);
  return 0;
}
 
int main() {  
  
  long int m, n, i;
  char m1[256], n1[256];
 
  scanf("%d %d", &m, &n);
  sprintf(m1, "%ld", m);
  sprintf(n1, "%ld", n);
 
  check(m1, n1);
 
  printf("\n");
  system("PAUSE");
  return 0;  
}
1)
при вводе:
12 5↵
ответ правильный:
2 (base 3) = 5 (base 6)↵

2)
про вводе:
10 A↵
ответ должен быть:
10 (base 10) = A (base 11)↵
у меня получается:
10 is not equal to -1073909472 in any base 2..36↵

3)
про вводе:
12 456↵
ответ должен быть:
12 is not equal to 456 in any base 2..36↵
у меня получается:
12 (base 27) = 456 (base 6)↵

подскажите, пожалуйста, что не так?

Добавлено через 6 минут
понял в чем 2 ошибка, исправил код:

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int check (char m[256], char n[256])
{
  int i, j;
  for (i=2; i<=36; i++)
  for (j=2; j<=36; j++) if (strtol( m, NULL, i ) == strtol( n, NULL, j )) { printf ("%s (base %d) = %s (base %d)\n", m, i, n, j); return 1; }
  printf("%s is not equal to %s in any base 2..36\n", m, n);
  return 0;
}
 
int main() {  
  
  long int i;
  char m[256], n[256];
 
  scanf("%s %s", &m, &n);
 
  check(m, n);
 
  printf("\n");
  system("PAUSE");
  return 0;  
}
а как быть с третьей ошибкой?

Добавлено через 1 час 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
145
    #include<stdio.h>           
      
    int change(char c)         
    {          
        int result=-1;          
        if ((c>='0')&&(c<='9'))          
        {result=(c-'0');}          
        else if((c>='A')&&(c<='Z'))          
        {result=(c-'A')+10;}    
        else if((c>='a')&&(c<='z'))    
        {result=(c-'a')+10;}    
        return result;          
    }          
      
    long double m(int x,int y)          
    {          
        long double result=1;          
        for(int i=0;i<y;i++)          
            result=result*x;          
        return result;          
    }          
      
    long double f(int *a,int lenth,int base)          
    {          
        long double result=0;          
        int k=0;          
        for(int i=lenth;i>0;i--)          
        {          
                      
            result=result+(*(a+k))*m(base,i-1);          
            k++;          
        }          
        return result;          
    }            
      
      
       int main()          
    {          
        int w=0;          
        int num[2][40];          
        for(int i=0;i<2;i++)          
        {          
            for(int j=0;j<40;j++)          
            {num[i][j]=-1;}          
        }          
        char ch[80];          
        char ch1[40],ch2[40];          
        int choice=0;          
        int m=0;          
              
        gets(ch);          
                for(int i=0;i<1;i++)       
            {       
                if(ch[i]==' ')       
                {       
                    for(int j=i;j<40;j++)       
                    {       
                        ch[j]=ch[j+1];       
                      }       
                    i=i-1;       
                }       
            }       
             
        for(int i=0;i<80;i++)          
        {          
            if(ch[i]=='\0')          
                break;          
            else if(ch[i]==32)          
            {choice=1;m=0;}          
            else         
            {num[choice][m]=change(ch[i]);m++;}          
        }    
        
             
        int max1=1,max2=1;          
        for(int i=0;i<40;i++)          
        {          
            if(num[0][i]>max1)          
                max1=num[0][i];          
            if(num[1][i]>max2)          
                max2=num[1][i];          
        }          
              
            
        int lenth1=0,lenth2=0;          
        for(int i=0;i<40;i++)          
        {          
            if(num[0][i]==-1)          
                break;          
            lenth1++;          
        }          
            for(int i=0;i<40;i++)          
        {          
            if(num[1][i]==-1)          
                break;          
            lenth2++;          
        }    
               
            for(int i=0;i<40;i++)       
            {       
                if(ch[i]==' ')       
                {       
                    for(int j=i;j<40;j++)       
                    {       
                        ch[j]=ch[j+1];       
                    }       
                    i=i-1;       
                }       
            }       
            char *chp;          
            chp=&ch[0];          
            for(int i=0;i<lenth1;i++)          
            {          
                ch1[i]=*chp;          
                chp++;          
            }          
            ch1[lenth1]='\0';          
            
            for(int i=0;i<lenth2;i++)          
            {          
                ch2[i]=*chp;          
                chp++;          
            }          
            ch2[lenth2]='\0';          
                   
        for(int i=max1+1;i<37;i++)          
        {          
            for(int j=max2+1;j<37;j++)          
            {          
               if(f(&num[0][0],lenth1,i)==f(&num[1][0],lenth2,j))          
                {          
                printf("%s (base %d) = %s (base %d)\n",ch1,i,ch2,j);          
                w=1;          
                if (w==1)          
                    break;          
                }          
                if (w==1)          
                    break;                       
            }          
            if (w==1)          
                    break;          
        }          
        if(w==0)          
            printf("%s is not equal to %s in any base 2..36\n",ch1,ch2);     
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2012, 11:57     Задача: преобразование систем счисления
Посмотрите здесь:

Перевод систем счисления. C++
функции для перевода из разных систем счисления C++
C++ Программа перевода систем счисления
C++ перевод чисел из систем счисления
C++ перевод систем счисления
умножение чисел систем счисления C++
Функция для конвертирования систем счисления. Не выходит :( C++
C++ направьте на путь истинный) перевод систем счисления

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.09.2012, 13:04     Задача: преобразование систем счисления #2
Ваша функция проверяет только первое совпадения двух чисел, а как насчет остальных, там же много совпадений получается? Пример:
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
12 5
12 (base 3) = 5 (base 6)
12 (base 3) = 5 (base 7)
12 (base 3) = 5 (base 8)
12 (base 3) = 5 (base 9)
12 (base 3) = 5 (base 10)
12 (base 3) = 5 (base 11)
12 (base 3) = 5 (base 12)
12 (base 3) = 5 (base 13)
12 (base 3) = 5 (base 14)
12 (base 3) = 5 (base 15)
12 (base 3) = 5 (base 16)
12 (base 3) = 5 (base 17)
12 (base 3) = 5 (base 18)
12 (base 3) = 5 (base 19)
12 (base 3) = 5 (base 20)
12 (base 3) = 5 (base 21)
12 (base 3) = 5 (base 22)
12 (base 3) = 5 (base 23)
12 (base 3) = 5 (base 24)
12 (base 3) = 5 (base 25)
12 (base 3) = 5 (base 26)
12 (base 3) = 5 (base 27)
12 (base 3) = 5 (base 28)
12 (base 3) = 5 (base 29)
12 (base 3) = 5 (base 30)
12 (base 3) = 5 (base 31)
12 (base 3) = 5 (base 32)
12 (base 3) = 5 (base 33)
12 (base 3) = 5 (base 34)
12 (base 3) = 5 (base 35)
12 (base 3) = 5 (base 36)
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
19.09.2012, 17:49     Задача: преобразование систем счисления #3
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
/////////////////////////////////////////////////////////////////////////////////////////
//Описание
//
//Имеются 2 цифры в разных системах счисления, цель задачи найти, в каких системах счисления 
//2 цифры равны. Например, 12 и 5, в десятичной системе счисления они не равны, 
//но 12 в 3-чной системе счисления 
//и 5 в 6-чной или десятичной системе счисления равны между собой.
//
//Input
//
//Вводятся два числа M и N ( которые в десятичной системе не превышают 1000000000), системы 
//счисления находятся в диапазоне 2~36. Для чисел меньше 10 использовать цифры 0~9, для чисел 
//больше 10 использовать заглавные буквы A~Z.
//
//Output
//
//Вывести в каких системах счисления M и N равны. Если равны, вывести соответствующий результат 
//(если результатов несколько, вывести тот результат, в котором система счисления наименьшая), 
//если не равны, вывести ошибку.
//
//Например, Input:
//12 5
//
//Output:
//12 (base 3) = 5 (base 6)
/////////////////////////////////////////////////////////////////////////////////////////
#include <cstdlib>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  print_comp_res
    (
        const T_str&    num_A_str,
        const T_str&    num_B_str
    )
{
    const int   BASE_MIN    =   2;
    const int   BASE_MAX    =   36;
    const char  NULL_SYMB   =   '\0';
 
    char*       A_end;
    char*       B_end;
 
    for( int  base_A = BASE_MIN; base_A <= BASE_MAX; ++base_A )
    {
        for( int  base_B = BASE_MIN; base_B <= BASE_MAX; ++base_B )
        {
            if  (
                            strtol
                                (
                                    num_A_str.c_str(),
                                    &A_end,
                                    base_A
                                )
 
                        ==  strtol
                                (
                                    num_B_str.c_str(),
                                    &B_end,
                                    base_B
                                )
 
                    &&  *A_end  ==  NULL_SYMB
                    &&  *B_end  ==  NULL_SYMB
                )
            {
                std::cout   <<  num_A_str
                            <<  "("
                            <<  base_A
                            <<  ") = "
                            <<  num_B_str
                            <<  "("
                            <<  base_B
                            <<  ")"
                            <<  std::endl;
 
                return;
            }//if
        }//for
    }//for
    std::cout   <<  "!="
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    for(;;)
    {
        std::cout   <<  "num_A = ";
        T_str   num_A_str;
        std::cin    >>  num_A_str;
 
        std::cout   <<  "num_B = ";
        T_str   num_B_str;
        std::cin    >>  num_B_str;
 
        print_comp_res
            (
                num_A_str,
                num_B_str
            );
 
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }
}
Yandex
Объявления
19.09.2012, 17:49     Задача: преобразование систем счисления
Ответ Создать тему
Опции темы

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