Перевод числа из любой системы счисления в десятичную - C (СИ)
Формулировка задачи:
Вроде бы и написал прогу, а все равно косяки выдает. Программа переводит число из любой СС в десятичную.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
long to10 (int b, char* str[])
{
int *a, n=0, t;
long r=0;
char c;
a=(int*) malloc (0);
while (n<=strlen(str)-1)
{
c=str[n];
if (c>='0' && c<='9') t=c-'0';
else if (c>='A' && c<='F') t=c-'A'+10;
else if (c>='a' && c<='f') t=c-'a'+10;
else break;
if (t>=b) break;
n++;
a=(int*)realloc(a, n*sizeof(int));
a[n-1]=t;
}
int i=0;
for (i=0; i<n; i++)
{
r+=a[n-1-i]*pow(b, i);
}
return r;
}
int main ()
{
int i=0, b;
char c;
char str[255];
printf ("Enter the basis: ");
scanf ("%d", &b);
while (!(b>1 && b<=16))
{
printf ("The basis is wrong. Enter it again: ");
scanf ("%d", &b);
}
printf ("Enter the number: ");
scanf (str);
printf ("Number with the basis 10: %ld", to10(b, &str));
return 0;
}Решение задачи: «Перевод числа из любой системы счисления в десятичную»
textual
Листинг программы
// Преобразует десятичное число в другую
// систему счисления (от 2-х до 10-ти)
#include <stdio.h>
#include <conio.h>
void main()
{
int osn, // основание системы счисления
n, // исходное число
cn, // копия исходного числа
r; // остаток от деления числа
// на основание сист счисл.
char st[17]; // представление числа в заданной сист. счисл.
int i;
printf("\Введите целое число ->");
scanf("%d", &n);
printf("Введите основание системы счисления ->");
scanf("%d", &osn);
cn = n;
// делим исходное число на основание системы
// счисления до тех пор, пока остаток от деления
// больше основания системы счисления.
// Остаток от деления на каждом щаге - очередная цифра
st[16] ='\0';
i = 15;
do {
r = n % osn; // очередная цифра
n = n / osn; // целая часть деления
// printf("цифра:%d остаток:%d\n", r,n);
st[i--] = r + 48; // преобразование цифры в символ
} while ( n > 0);
// "сдвинем" сформированную строку в начало
i++;
int j = 0;
while(st[i])
st[j++] = st[i++];
st[j] = '\0';
st[i--] = ' ';
printf("Десятичному числу %d соответствует ", cn);
printf("число %s по основанию %d\n", st, osn);
printf("\nДля завершения нажмите <Enter>");
getch();
}
Объяснение кода листинга программы
- Ввод исходных данных:
- Ввод исходного числа с клавиатуры, сохранен в переменной n.
- Ввод основания системы счисления с клавиатуры, сохранено в переменной osn.
- Создание копии исходного числа, сохранено в переменной cn.
- Деление исходного числа на основание системы счисления, сохранено в переменной n.
- Получение остатка от деления, сохранено в переменной r.
- Добавление очередной цифры к представлению числа в виде строки, сохранено в переменной st.
- Уменьшение значения переменной i на 1.
- Проверка, что n больше нуля, чтобы продолжить выполнение цикла.
- Сдвиг сформированной строки в начало, сохранено в переменной j.
- Вывод результата:
- Вывод представления числа в заданной системе счисления, сохранено в переменной st.
- Вывод основания системы счисления, сохранено в переменной osn.
- Завершение работы программы:
- Ожидание нажатия клавиши Enter для завершения работы программы. Код преобразует десятичное число в другую систему счисления, вводящуюся с клавиатуры. Он сначала получает основание системы счисления и исходное число, затем преобразует число в систему счисления, используя цикл деления на основание системы счисления. После этого он выводит результат в виде строки в заданной системе счисления.