# Optimization of algorithms

Hi!
Before I begin, it should be noted that the reason I am making this algorithm is for the sole purpose of manually translating it to assembly as a programming excersize.

I'd like to optimize this algorithm if possible - this is a single C function which should return a string representing a number. The string won't print with printf at the moment, however, this isn't a problem as the function i use in assembler to print the string is very different from printf.

[code]
int int2str(unsigned int num, unsigned int *string)
{
unsigned int digits, x, y, z, n = 0;
//find the total number of digits.
for (digits = 0; exponent(digits, 10) <= num; digits++)
;

//for each digit, find the digit's value and add it to
//the string
for (x = digits; x >= 1; x = x-1)
{
//find the value of the largest digit
y = num;
z = x;
// ">>" until only one digit is left
while (z >= 2)
{
y=y/10;
z = z-1;
}
//add the digit to the string
string[n] = y+48;
n++; //increment the character index
//remove the largest digit from num
num = num-(y*exponent(x-1, 10));
}
string [n] = 0;

}

//exponent was used elsewhere. This function returns x to the nth power:
int exponent(int x, int n)
{
//code here
}
[/code]

Thanks for any help you may be able to offer! I'll be honest, i'm not a C expert, i am much more interested in learning assembler.
Sincerely,
Jakykong (Jack Mudge)
jack_mudge@hotmail.com

## Comments

• [b][red]This message was edited by tsagld at 2006-5-22 3:27:17[/red][/b][hr]
: Hi!
: Before I begin, it should be noted that the reason I am making this algorithm is for the sole purpose of manually translating it to assembly as a programming excersize.
:
: I'd like to optimize this algorithm if possible - this is a single C function which should return a string representing a number. The string won't print with printf at the moment, however, this isn't a problem as the function i use in assembler to print the string is very different from printf.
:
: [code]
: int int2str(unsigned int num, unsigned int *string)
: {
: unsigned int digits, x, y, z, n = 0;
: //find the total number of digits.
: for (digits = 0; exponent(digits, 10) <= num; digits++)
: ;
[red]
//instead of the above loop, this is much faster
//(only usable for base 10 ofcourse).
//no need for a, probably slow, exponent-function.
int digits = 1, testnum = 10;
while (testnum < num) { testnum *= 10; digits++; }
[/red]

: //for each digit, find the digit's value and add it to
: //the string
: for (x = digits; x >= 1; x = x-1)
: {
: //find the value of the largest digit
: y = num;
: z = x;
: // ">>" until only one digit is left
: while (z >= 2)
: {
: y=y/10;
: z = z-1;
: }
: //add the digit to the string
: string[n] = y+48;
: n++; //increment the character index
: //remove the largest digit from num
: num = num-(y*exponent(x-1, 10));
: }
: string [n] = 0;

[red]
//The entire loop above can be replaced by:
sprintf(string, "%d", num);

//but, since you are going to convert this to assembly,
//you may not want to use sprintf.
//then the following is a faster alternative:
int index = digits;
string[index--] = '';
while (num > 0)
{
string[index--] = (num % 10) + '0';
num /= 10;
}
[/red]

//that's all!

: }
:
: //exponent was used elsewhere. This function returns x to the nth power:
: int exponent(int x, int n)
: {
: //code here
: }
: [/code]
:
: Thanks for any help you may be able to offer! I'll be honest, i'm not a C expert, i am much more interested in learning assembler.
: Sincerely,
: Jakykong (Jack Mudge)
: jack_mudge@hotmail.com
:

Greets,
Eric Goldstein
http://www.gvh-maatwerk.nl

• [b][red]This message was edited by Jakykong at 2006-5-22 5:13:1[/red][/b][hr]
: [b][red]This message was edited by tsagld at 2006-5-22 3:27:17[/red][/b][hr]
: : Hi!
: : Before I begin, it should be noted that the reason I am making this algorithm is for the sole purpose of manually translating it to assembly as a programming excersize.
: :
: : I'd like to optimize this algorithm if possible - this is a single C function which should return a string representing a number. The string won't print with printf at the moment, however, this isn't a problem as the function i use in assembler to print the string is very different from printf.
: :
: : [code]
: : int int2str(unsigned int num, unsigned int *string)
: : {
: : unsigned int digits, x, y, z, n = 0;
: : //find the total number of digits.
: : for (digits = 0; exponent(digits, 10) <= num; digits++)
: : ;
: [red]
: //instead of the above loop, this is much faster
: //(only usable for base 10 ofcourse).
: //no need for a, probably slow, exponent-function.
: int digits = 1, testnum = 10;
: while (testnum < num) { testnum *= 10; digits++; }
: [/red]
:
: : //for each digit, find the digit's value and add it to
: : //the string
: : for (x = digits; x >= 1; x = x-1)
: : {
: : //find the value of the largest digit
: : y = num;
: : z = x;
: : // ">>" until only one digit is left
: : while (z >= 2)
: : {
: : y=y/10;
: : z = z-1;
: : }
: : //add the digit to the string
: : string[n] = y+48;
: : n++; //increment the character index
: : //remove the largest digit from num
: : num = num-(y*exponent(x-1, 10));
: : }
: : string [n] = 0;
:
: [red]
: //The entire loop above can be replaced by:
: sprintf(string, "%d", num);
:
: //but, since you are going to convert this to assembly,
: //you may not want to use sprintf.
: //then the following is a faster alternative:
: int index = digits;
: string[index--] = '';
: while (num > 0)
: {
: string[index--] = (num % 10) + '0';
: num /= 10;
: }
: [/red]
:
: //that's all!
:
: : }
: :
: : //exponent was used elsewhere. This function returns x to the nth power:
: : int exponent(int x, int n)
: : {
: : //code here
: : }
: : [/code]
: :
: : Thanks for any help you may be able to offer! I'll be honest, i'm not a C expert, i am much more interested in learning assembler.
: : Sincerely,
: : Jakykong (Jack Mudge)
: : jack_mudge@hotmail.com
: :
:
:
: Greets,
: Eric Goldstein
: http://www.gvh-maatwerk.nl
:
:
:
:
:

Thanks! Heh ... well can anyone tell that i don't program many high-level applications?

And, on the loop to find the digit. DUH! why didn't i think of that? of course - modulus. the remainder. the remainder is always going to be the last digit if you divide by 10 .... i even knew that too ... thats how i convert from base to base by hand.

Thanks again!
Sincerely,
Jakykong (Jack Mudge)
jack_mudge@hotmail.com

Sign In or Register to comment.

#### Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!