Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdlib.h>
- #include <ctype.h>
- #include <string.h>
- #include <stdio.h>
- int proverka(int b1, int b2, char *num1) {
- //проверка систем счисления
- if (b1 > 16 || b1 < 2 || b2>16 || b2 < 2) {
- printf("bad input");
- return 0;
- }
- //нахождение индекса точки
- int p1 = 0;
- int tochka = -1;
- int dlina = 0;
- for (int i = 0; num1[i] != '\0'; i++) {
- num1[i] = tolower(num1[i]);
- dlina++;
- if (num1[i] == '.') {
- //проверка, что точка одна
- if (p1 == 1) {
- printf("bad input");
- return 1;
- }
- tochka = i;
- p1 = 1;
- }
- //проверка, что точка не на первом месте
- if (tochka == 0) {
- printf("bad input");
- return 1;
- }
- //проверка введенного числа
- if (num1[i] != '.' && (num1[i] - '0' < 10 && (num1[i] - '0' > b1 - 1 || num1[i] - '0' < 0))) {
- printf("bad input");
- return 1;
- }
- if (num1[i] != '.' && (num1[i] - '0' > 10 && (num1[i] - 'a' + 10 > b1 - 1 || num1[i] - 'a' + 10 < 10))) {
- printf("bad input");
- return 1;
- }
- }
- //проверка, что точка стоит не на последнем месте
- if (tochka == dlina - 1) {
- printf("bad input");
- return 1;
- }
- return 0;
- }
- char perev(int b1, int b2, char* num1, char* num2) {
- //нахождение индекса точки
- int p1 = 0;
- int tochka = -1;
- int dlina = 0;
- for (int i = 0; num1[i] != '\0'; i++) {
- num1[i] = tolower(num1[i]);
- dlina++;
- if (num1[i] == '.') {
- tochka = i;
- p1 = 1;
- }
- }
- //если системы счисления равны, вывести число
- if (b1 == b2) {
- printf("%s", num1);
- return 0;
- }
- if (tochka == -1) tochka = dlina;
- unsigned long long dot = 0;
- double poslt = 0, b1pow = 1;
- //Переводим в десятичную cc до точки
- for (int i = tochka - 1; i >= 0; i--) {
- if (num1[i] - '0' < 10) {
- dot += (num1[i] - '0') * (unsigned long long)b1pow;
- }
- else {
- dot += (num1[i] - 'a' + 10) * (unsigned long long)b1pow;
- }
- b1pow *= b1;
- }
- b1 = 1.0 / b1;
- //Переводим в десятичную часть после точки
- for (int i = tochka + 1; i <= dlina; i++) {
- if (num1[i] - '0' < 10) {
- poslt += (num1[i] - '0') * (unsigned long long)b1pow;
- }
- else {
- poslt += (num1[i] - 'a' + 10) * (unsigned long long)b1pow;
- }
- b1pow *= b1;
- }
- int num3[100];
- dlina = 0;
- if (dot == 0) {
- num3[0] = 0;
- dlina = 1;
- }
- //Переводим в b2-ичную часть до точки
- for (int i = 0; dot > 0; i++) {
- num3[i] = dot % b2;
- dlina++;
- dot /= b2;
- }
- //Делаем разворот и переводим в char часть до точки
- for (int i = 0; i < dlina; i++) {
- if (num3[dlina - i - 1] < 10) {
- num2[i] = num3[dlina - i - 1] - '0';
- }
- else {
- num2[i] = num3[dlina - i - 1] - 'a' + 10;
- }
- }
- if (p1 != 1 || poslt == 0.0) {
- num2[dlina] = '\0';
- return 0;
- }
- num2[dlina] = '.';
- //Переводим в b2-ичную часть после точки
- for (int i = dlina + 1; i < dlina + 13; i++) {
- poslt *= b2;
- num3[i] = (int)poslt;
- poslt -= (int)poslt;
- if (num3[i] < 10) {
- num2[i] = num3[i] - '0';
- }
- else {
- num2[i] = num3[i] + 10 - 'a';
- }
- }
- num2[dlina + 13] = '\0';
- return 0;
- }
- int main() {
- int b1, b2;
- scanf_s("%d%d", &b1, &b2);
- char num1[20];
- scanf_s("%13s", num1, sizeof(num1));
- char num2[100];
- int a = proverka(b1, b2, num1);
- if (a == 0) {
- perev(b1, b2, num1, num2);
- printf("%s", num2);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement