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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
#1

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

19.09.2012, 11:57. Просмотров 842. Ответов 2
Метки нет (Все метки)

Описание

Имеются 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++
Здравствуйте, сразу оговорюсь: занимаюсь программированием три дня. Я вот пытался сделать программу по переводу числа из 16-ричной системы...

Перевод систем счисления - C++
Здравствуйте,помогите пожалуйста доработать программу перевода числа в разные системы счисления.Нужно чтобы заместо цифр 10 11 12 13 14...

перевод систем счисления - C++
1. Задание: Напишите программу перевода чисел из 2 системы в 10. 2.Задание: Напишите программу выполнения арифметических операций в...

Перевод систем счисления - C++
Здраствуйте, на входе имеется некое десятеричное число (примеры:1 / 2,8 / 0,123456) как перевести в другую систему счисления пробовал...

Программа перевода систем счисления - C++
Не могу написать программу по переводу числа из 10-ой в 2-ую. Смотрел другие темы не понял да и программы там не понятные были. Если...

перевод чисел из систем счисления - C++
Составить программу перевода чисел из десятичной системы счисления в систему с основанием: 12; 31; 3; и программу обратного перевода

умножение чисел систем счисления - C++
задание: Написать программу для выполнения арифметических операций в разных системах счисления. вариант: 13. Числа по основанию 8 и 4....

Универсальный конвертер систем счисления - C++
Напишите программу, переводящую запись числа между двумя произвольными системами счисления. Входные данные На вход программа...

Функция перевода систем счисления - C++
Написать функцию с параметром перевода десятичного числа из системы с основанием меньше 10 в десятичную систему счисления

направьте на путь истинный) перевод систем счисления - C++
прошу помощи. как реализовать перевод из 10 сис.счисления в любую другую(по моему примеру)?вроде бы все должно идти верно.. в кнопке...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1429 / 766 / 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
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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;
    }
}
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru