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

Изменение системы счисления - C++

Восстановить пароль Регистрация
 
A1mirr
Сообщений: n/a
04.11.2012, 19:09     Изменение системы счисления #1
Задача: перевести число (возможно, очень большое) из данной системы счисления в другую, а так же циклически сдвинуть переведённое число его на d позиций
Проблема решения: на некоторых вариантах (например 16->32 или 22->10) программа работает неправильно
Что не так?

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
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
void main ()
{
    long i=0,n=0,k=0,d=0,p=1;
    char c[32768], ic[32768],dc[32768], inp[32768],base_out,base_inp,ch;
    base_inp=10;                                        //в какой вводим
    base_out=22;                                        //в какой выводим
    for (i=0;i<32769;i++)
        c[i]=ic[i]=dc[i]=inp[i]=0;
    printf("vvedite korrektnoe polozhitelnoe chislo\n");
    while((int(ch=getchar())!='\n'))                        // считывание вводимого числа
    {                                                       
        n++;                                        //количество цифр в числе
        inp[n]=ch;                                          
        if (inp[n]>96) inp[n]+=-87;                 //перевод малых английских в цифры
        if (inp[n]>64) inp[n]+=-55;                         //больших английских
        if (inp[n]>47) inp[n]+=-48; 
    }
 
    while (p!=n+1)                              //перевод в заданную систему счисления
    {
        inp[n+1]=0;                                         
        for(i=1;i<=n;i++)                                   
        {                                                   
            inp[i+1]=inp[i+1]+(inp[i]%base_out)*base_inp;   
            inp[i]=inp[i]/base_out;                         
        }                                                   
        c[k]=inp[n+1]/base_inp;                             
        if (!inp[p]) p++;                                   
        k++;                                                
    }
    while (c[k]==0) k--;                                    //убираем нули в начале
    for(i=k;i>-1;i--)                                       //вывод числа
        if (c[i]<10) printf("%c",(c[i])+48);
        else printf("%c",(c[i])+55);
    printf("\nvvedite sdvig\n");            
    scanf("%d",&d);
    printf("   ");
    for(i=k;i>-1;i--)                                       //сдвиг
    {
        ic[(i+d+100000*(k+1))%(k+1)]=c[i];                  //влево
        dc[(i-d+100000*(k+1))%(k+1)]=c[i];                  //вправо
    }                                   //100000 нужны, если сдвиг очень большой
 
    printf("\n<< \n");
    for(i=k;i>-1;i--)                                       //вывод сдвинутого влево
        if (ic[i]<10) printf("%c",(ic[i])+48);
        else printf("%c",(ic[i])+55);
    printf("\n>> \n");
    for(i=k;i>-1;i--)                                       //вывод сдвинутого вправо
        if (dc[i]<10) printf("%c",(dc[i])+48);
        else printf("%c",(dc[i])+55);
    getch();
}
Добавлено через 11 часов 51 минуту
Отвечу сам себе: возникало переполнение char'a, потому и работало некорректно. Заменил на int и всё стало как надо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 19:09     Изменение системы счисления
Посмотрите здесь:

C++ Простейший алгоритм перевода числа из 10 системы счисления в 16 ричную систему счисления
C++ Перевод натурального числа из десятичной системы счисления в систему счисления по основанию
C++ Системы счисления
C++ Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно
Системы счисления C++
C++ Системы счисления
Системы счисления C++
C++ С восьмеричной системы счисления в десятичную систему счисления

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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