Optimization of algorithms - Programmers Heaven

Howdy, Stranger!

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

Categories

Optimization of algorithms

JakykongJakykong Posts: 103Member
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)
[email protected]

Comments

  • tsagldtsagld Posts: 621Member
    [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)
    : [email protected]
    :


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




  • JakykongJakykong Posts: 103Member
    [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)
    : : [email protected]
    : :
    :
    :
    : 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)
    [email protected]



Sign In or Register to comment.