From 6dda71ab86a574a351f7c89da5d3cf9b49647407 Mon Sep 17 00:00:00 2001 From: Joursoir Date: Sat, 6 Feb 2021 20:06:53 +0000 Subject: add change base of number algorithm --- snc.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ snc.h | 5 +++++ 2 files changed, 82 insertions(+) diff --git a/snc.c b/snc.c index 3585141..4b2b1e5 100644 --- a/snc.c +++ b/snc.c @@ -21,9 +21,27 @@ #include #include #include +#include #include "snc.h" +void push(struct stack **head, char ch) +{ + struct stack *temp = malloc(sizeof(struct stack)); + temp->next = *head; + temp->ch = ch; + *head = temp; +} + +char pop(struct stack **head) +{ + struct stack *temp = *head; + char ch = (*head)->ch; + *head = (*head)->next; + free(temp); + return ch; +} + void usage() { printf("SNC (Simple numbers converter)\n" @@ -131,6 +149,65 @@ char *arabicToRoman(char *str) return answer; } +int getValueFromChar(char ch) +{ + switch(ch) + { + case '0'...'9': + return ch - 48; + case 'A'...'Z': + return ch - 55; // ch - 65 + 10 + case 'a'...'z': + return ch - 87; // ch - 97 + 10 + default: return -1; + } +} + +char getCharFromValue(int value) +{ + if(value >= 0 && value <= 9) + return '0' + value; + else if(value >= 10 && value <= 36) + return 'A' - 10 - value; + return '}'; +} + +int toTenBase(int base, char *str) +{ + int length = strlen(str); + int answer = 0; + + while(*str) + { + int value = getValueFromChar(*str); + if(value == -1 || value >= base) + return -1; + answer += value * pow(base, --length); + str++; + } + return answer; +} + +char *fromTenBaseTo(int base, int number) +{ + int length = 1, i; + char *answer; + struct stack *s = NULL; + while(number >= base) + { + push(&s, getCharFromValue(number % base)); + number /= base; + length++; + } + + answer = malloc(sizeof(char) * (length+1)); + answer[0] = getCharFromValue(number); + for(i = 1; s; i++) + answer[i] = pop(&s); + answer[length] = '\0'; + return answer; +} + int main(int argc, char *argv[]) { if(argc == 1) { diff --git a/snc.h b/snc.h index c7bd7c3..3cc84d7 100644 --- a/snc.h +++ b/snc.h @@ -20,6 +20,11 @@ along with this program; if not, see . ***/ +struct stack { + char ch; + struct stack *next; +}; + enum { SNC_ARABIC, SNC_ROMAN, -- cgit v1.2.3-18-g5258