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

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

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.