Im trying to convert a number to a different base. Does anyone know what library has the converter in it.
Thanks
Im trying to convert a number to a different base. Does anyone know what library has the converter in it.
Thanks
Last edited by cdonlan; 01-17-2005 at 05:07 PM.
It took a long time! But I got it!! I've got the golden ticket! It took some testing, but now it's bake-ready! It's for C, but of course you could compile this in C++. And no negative comments plz, I took awhile peicing this together.
Code:#include <stdio.h> #include <string.h> #include <ctype.h> #include <math.h> #define MAXREAL 1e40 int ba,bd; char x[40],y[40]; float r; enum bool { TRUE, FALSE }; char *strrev(const char *s) { int i=0, len=strlen(s); char *str = NULL; if ((str=malloc(strlen(s)+1)) == NULL) {/*cannot allocate memory */ return NULL; } while(len) str[i++]=s[--len]; str[i] = '\0'; return (str); } // Convert a number from base b to base 10. The function returns // FALSE if b not in [2..36] or if string x contains invalid // characters in base b or if result y is too big. enum bool DecodeBase(char *x,int b, float *y) { int lgth,i,j; float mult; char *ch; if (b<2 || b>36) { printf(" Base must be between 2 and 36 !\n"); return FALSE; } *y=0; mult=1.0; lgth=strlen(x); for (i=0; i<lgth; i++) { ch=&x[lgth-i-1]; if (!isalnum(ch[0])) { printf(" Error in input number.\n"); return FALSE; } if (*ch<='9') j=toupper(*ch)-'0'; else j=toupper(*ch)-'A'+10; if (j>=b) return FALSE; *y+=mult*j; if (mult>MAXREAL/b) return FALSE; mult=mult*b; } return TRUE; } //Convert a number from base 10 to base b. The function returns //FALSE if b not in [2..36] or if string x contains invalid //characters in base 10 or if number x is too big. enum bool CodeBase(float x,int b, char *y) { int n; char ch[2]; if (b<2 || b>36) { printf(" Base must be between 2 and 36 !\n"); return FALSE; } strcpy(y, ""); while (x>0) { n=(int) floor(x - b * (int)(x/b)); if (n<10) { //y=Chr(Ord("0")+n)+y; sprintf(ch,"%d",n); strcat(y,ch); } else { //y=Chr(Ord("A")+n-10) +y; switch(n) { case 10: strcat(y,"A"); break; case 11: strcat(y,"B"); break; case 12: strcat(y,"C"); break; case 13: strcat(y,"D"); break; case 14: strcat(y,"E"); break; case 15: strcat(y,"F"); break; case 16: strcat(y,"G"); break; case 17: strcat(y,"H"); break; case 18: strcat(y,"I"); break; case 19: strcat(y,"J"); break; case 20: strcat(y,"K"); break; case 21: strcat(y,"L"); break; case 22: strcat(y,"M"); break; case 23: strcat(y,"N"); break; case 24: strcat(y,"O"); break; case 25: strcat(y,"P"); break; case 26: strcat(y,"Q"); break; case 27: strcat(y,"R"); break; case 28: strcat(y,"S"); break; case 29: strcat(y,"T"); break; case 30: strcat(y,"U"); break; case 31: strcat(y,"V"); break; case 32: strcat(y,"W"); break; case 33: strcat(y,"X"); break; case 34: strcat(y,"Y"); break; case 35: strcat(y,"Z"); } } x=(float) (int)(x/b); } y=strrev(y); //string inversion return TRUE; } int main(void) { int theBaseIWant = 2; int theNumber = 40; char Output[255]; // From base 10 -> 2 if(CodeBase(theNumber, theBaseIWant, Output) == TRUE) { puts(Output); } else { puts("WWWHHYY!!"); return 0; } // From Base 16(Hex) --> Base 2(Binary) float decimal; char Input[] = "00FF"; if(DecodeBase(Input, 16, &decimal) == FALSE) { puts("WWWHHYY!!"); return 0; } if(CodeBase(decimal, 2, Output) == FALSE) { puts("WWWHHYY!!"); return 0; } printf("Our decimal: %.2f\n", decimal); /* Tested the strrev() function char *myWord = "Hello World"; char WordBackwards[strlen(myWord)+1]; if(strrev(myWord) != NULL) { strcpy(WordBackwards, strrev(myWord)); puts(WordBackwards); } else { puts("AAHH!!"); }*/ /* Original source printf("\n BASE CONVERSION\n\n"); printf(" Start Base (2 to 36): "); scanf("%d",&bd); printf(" Arival Base (2 to 36): "); scanf("%d",&ba); strcpy(x,"1"); while (strcmp(x,"0")!=0) { printf("\n Enter number in start base: "); scanf("%s",x); if (strcmp(x,"0")!=0) { if (DecodeBase(x,bd,&r)) { if (CodeBase(r,ba,y)) printf(" In base %d: %s\n",ba,y); else printf(" Error in coding number.\n"); } else printf(" Error in decoding number.\n"); } } printf("\n\n");*/ return 0; }
If I only need bases 3 ,5,7, and 9. And the largest the number could go up to is 1,000,000 I could cut out a lot of that stuff In the 10 to b-base function.
Well you probably could, it was made to work with base-2 through base-30 I believe.
For some reason it does not like the strrev function. I included all the header files.
then use my code
it converts base 10 to any base (2-36)
I just threw it together, but it works fine I think.
Code:#include <iostream> #include <string.h> using namespace std; int main() { string output; int input, base, counter=0; cout << "Please input the number to be converted: "; cin >> input; cout << "Please input the base to convert to: "; cin >> base; while (input != 0) { switch (input % base) { case 0: output += '0'; break; case 1: output += '1'; break; case 2: output += '2'; break; case 3: output += '3'; break; case 4: output += '4'; break; case 5: output += '5'; break; case 6: output += '6'; break; case 7: output += '7'; break; case 8: output += '8'; break; case 9: output += '9'; break; case 10: output += 'A'; break; case 11: output += 'B'; break; case 12: output += 'C'; break; case 13: output += 'D'; break; case 14: output += 'E'; break; case 15: output += 'F'; break; case 16: output += 'G'; break; case 17: output += 'H'; break; case 18: output += 'I'; break; case 19: output += 'J'; break; case 20: output += 'J'; break; case 21: output += 'K'; break; case 22: output += 'L'; break; case 23: output += 'M'; break; case 24: output += 'N'; break; case 25: output += 'O'; break; case 26: output += 'P'; break; case 27: output += 'Q'; break; case 28: output += 'R'; break; case 29: output += 'S'; break; case 30: output += 'T'; break; case 31: output += 'U'; break; case 32: output += 'V'; break; case 33: output += 'W'; break; case 34: output += 'X'; break; case 35: output += 'Y'; break; case 36: output += 'Z'; break; } input = input/base; counter++; } cout << "The result of the conversion is "; while (counter > -1) { cout << output[counter]; counter--; } cout << "\n"; return 0; }
What's the error code? It works fine for me. strrev() is also inside <windows.h>, so beware. You may want to rename strrev to strrev2 just so there aren't any conflicting methods. Good luck!Originally Posted by cdonlan
Nice function MadCow
Well,
Since this is the C++ section, and not C, strrev() would not be the first to choose from. strrev() is not within the C++ standard. Though, there is another function that is within the C++ standard library called reverse_copy().
Looking closer at Kleid-0's code, I see that he passes a character array that holds 255 characters to CodeBase(). Though when he handles it, he passes that function to strrev() which allocates memory to it. Just an observation.
Even though strrev() isn't standard, it could be done simply by using the XOR method:All in all, I don't see a need to use a C-style function in C++.Code:char* strrev(char *str) { char *p1, *p2; if (!str || !*str) return str; for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) { *p1 ^= *p2; *p2 ^= *p1; *p1 ^= *p2; } return str; }
- Stack Overflow
Segmentation Fault: I am an error in which a running program attempts to access memory not allocated to it and core dumps with a segmentation violation error. This is often caused by improper usage of pointers, attempts to access a non-existent or read-only physical memory address, re-use of memory if freed within the same scope, de-referencing a null pointer, or (in C) inadvertently using a non-pointer variable as a pointer.
Kleid-0, you need to take a break pal. Go get laid or drunk or both.
i don't think most standard compilers support programmers with more than 4 red boxes - Misplaced
It is my sacred duity to stand in the path of the flood of ignorance and blatant stupidity... - quzah
Such pointless tricks ceased to be interesting or useful when we came down from the trees and started using higher level languages. - Salem
YOU JUST BACK OFF ANDY!!! lol, j/k . I deleted that post, I was releasing too much negative energy!
strtoul() will convert from any base (2-36) to a standard integer.
cout can display a number in octal, decimal, or hex, and with a little help from <bitset> you can display in binary.
There isn't a standard built-in function to convert from a standard integer to any base. But if you have a Microsoft compiler, itoa() will do exactly that.
Note that any conversion is normally done only during input or output. The above functions convert between an integer and a C-style-string representation of the number in another base.
All variables in the computer's memory are stored in binary. C++ changes it to decimal input/output by default. This means that you can enter one number in decimal, another in hex, add them together, and display the result in octal, without worrying about the fact that you mixing bases!
Here's an example program I wrote a couple of years ago:
Originally Posted by MadCow257
I'm writing a similiar program that also accomplishes a conversion task, but I'm trying to rewrite this so that for a value it would print out all the conversions from base 2 up to base 30. I was wondering what would be the best way to translate it and print out all bases instead of a specific. Thanks.
I made something like this (Decimal to BASE) a couple weeks ago...I'm not so good, but I think this does pretty much what it's supposed to.
It'll go up to base...36, I think. It doesn't have any case statements!
I just took a look at the file, it actually does have case statments. I'm just trying to get a simplified version of the code but being able to take argv[1] and conver it from base 2 up to base 30. Bascially not having to specify the cases. I tried to modifed the other verison that I put up, but I get some weird errors. I'm not sure how they looped through it to actually get the values. Thank you.