User forums > Help

Problem ....

<< < (2/2)

stahta01:
Bye, you still do not give enough info.
You say you have no compiler; therefore it will NOT compile if you are telling the truth.
Assuming you install a compiler; please give path to compiler and post a full compiler build log for someone else to try to help you.

Tim S.

PS: Sorry if your Language is not English; but, your post implies you never install a compiler.

SpiderMan:
I installed the CodeBlocks default compiler ... the program compiled, run but it didn't gave the correct result. And i run with MinGW ( a friend ) and it worked, and sorry, i forggot to say that i have CodeBlocks too  :P

stahta01:

--- Quote from: stahta01 on June 18, 2010, 04:37:39 pm ---Read
http://wiki.codeblocks.org/index.php?title=FAQ#Q:_How_do_I_troubleshoot_an_compiler_problem.3F
Post a complete re-build log from both working and non working setup.

You failed to give enough info to get real help.


--- End quote ---

SpiderMan:
Ok, now i'll try to make you understanding my situation. Now i paste you my code :

--- Code: ---# include <fstream>
# include <cstring>
# include <cmath>
using namespace std;

#define MAX 105

int N[MAX], i[MAX] ;
int j;
char c[MAX];

ifstream f("free.in");
ofstream g("free.out");

void atrh (int A[], int B[]) // A <- B
{
    for (int i = 0; i <= B[0]; ++i) A[i] = B[i];
}

void add (int A[], int B[]) // A <- A + B
{
    int i, t = 0;

    for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= 10)
        A[i] = ( t += ( i <= A[0] ? A[i] : A[i] = 0 ) + ( i <= B[0] ? B[i] : B[i] = 0 ) ) % 10;

    A[0] = i - 1;
}

void sub (int A[], int B[]) // A <- A - B, A >= B
{
    int i, t = 0;
    for (i = 1; i <= A[0]; i++)
        A[i] += ( t = ( A[i] -= ( i <= B[0] ? B[i] : B[i] = 0 ) + t ) < 0 ) * 10;

    for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

inline int comp (int A[], int B[]) // A ? B , ? == <, >, =
{
    while (A[0] && !A[A[0]]) A[0]--;
    while (B[0] && !B[B[0]]) B[0]--;

    if (A[0] < B[0]) return -1;
    else if (A[0] > B[0]) return 1;
    for (int i = A[0]; i > 0; --i)
        if (A[i] < B[i]) return -1;
        else if (A[i] > B[i]) return 1;
    return 0;
}

void atr (int A[], long long X) // A[] <- X
{
    for ( A[0] = 0; X ; X /= 10)
        A[++A[0]] = X % 10;
}

void atr0 ( int A[] )
{
    A[0] = 0;
}

void mulmare (int A[], int B[]) // A <- A * B
{
    int i, j, t, C[MAX];        // C <- A * B

    memset(C, 0, sizeof(C));

    for (i = 1; i <= A[0]; i++)
    {
        for (t = 0, j = 1; j <= B[0] || t; j++, t /= 10)
            C[i + j - 1] = ( t += C[i + j - 1] + A[i] * B[j] ) % 10;
        if ( i + j - 2 > C[0] ) C[0] = i + j - 2;
    }

    memcpy(A, C, sizeof(C));   // A <- C
}

void Shr (int A[], int Count) // A <- A / ( 10 * Count )
{
    memmove ( &A[1], &A[Count + 1], sizeof(int) * ( A[0] - Count ) );

    A[0] -= Count;
}

void Shl (int A[], int Count) // A <- A * ( 10 * Count )
{
    memmove ( &A[Count + 1], &A[1], sizeof(int) * A[0] );
    memset ( &A[1], 0, sizeof(int) * Count );

    A[0] += Count;
}


void imp (int A[], int B) // A[] <- A[] / B
{
    int i, t = 0;
    for (i = A[0]; i > 0; i--, t %= B)
        A[i] = (t = t * 10 + A[i]) / B;
    for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

void impmare (int A[], int B[], int C[]) // C <- A * B rest R
{
    int R[MAX];

    R[0] = 0, C[0] = A[0];

    for (int i = A[0]; i ; i--)
    {
        Shl (R, 1), R[1] = A[i];

        for (C[i] = 0; comp(B,R) != 1 ; ++C[i], sub(R, B)) ;
    }

    for (; !C[C[0]] && C[0] > 1 ; C[0]--);
}
void mul (int A[], int B) // A[] <- A[] * B
{
    int i, t = 0;
    for (i = 1; i <= A[0] || t; i++, t /= 10)
        A[i] = (t += ( i <= A[0] ? A[i] : A[i] = 0 )  * B) % 10;

    A[0] = i - 1;
}

void citire(int x[],char a[])
{
    x[0]=strlen(a);
    for ( int i = x[0] -1; i >= 0; --i )
        x[i+1]=a[x[0]-i-1] - '0';
}

void write( int A[] )
{
    if ( A[0] == 0 ) g << "0";
    else for (int i = A[0]; i ; --i) g << A[i];
    g << "\n";
}

void radical_2 ( int A[], int B[] )
{
    int AUX = 0 , i;
    int C[MAX], D[MAX], E[MAX], F[MAX];

    if ( A[0] & 1 ) AUX = A[A[0]], i = A[0] - 1;         // formez prima pereche
    else AUX = A[A[0]] * 10 + A[A[0] - 1], i = A[0] - 2;

    int aux = (int) sqrt(AUX) ;                          // aflu nr. cel mai apropiat de prima pereche

    atr (B, aux);                                        // atribui rezultatului nr. aflat anterior

    if ( A[0] == 1 || A[0] == 2) return ;                // daca nr. are 1, 2 cifre, opresc

    AUX -= aux * aux;                                    // fac scaderea

    atr(E, AUX), Shl(E, 1), atr(F, A[i]), add(E, F);     // E = AUX, E *= 10, E += A[i];
                                                         // adica formez noul numar, adaugand urm. pereche de cate 2 cifre
    Shl(E, 1), atr(F, A[i - 1]), add(E, F);              // E *= 10, E += A[i - 1];
                                                         // la fel, formez noul numar adaugand cea de-a doua cifra
    atrh(C, E), atrh(F, B), mul(F, 2), atrh(E, F);       // dublez pe E

    i -= 2;                                              // scad 2 unitati, adica cele 2 cifre atribuite

    atrh(D, C), Shr(D, 1), impmare(D, E, D);             // aici scap de ultima cifra a nr. si o impart la E

    int U[] = {1, 9};                                    // vector auxiliar ce reprezinta cifra 9
    int Z[] = {1, 1};                                    // vector auxiliar ce reprezinta cifra 1

    if (comp(D, U) == 1) atr(D, 9);                      // daca cumva ultima cifra pe care trebuie sa o adaugam la
                                                         // rezultat e > 9, atunci ii atribuim valoarea maxima, 9
    Shl(E, 1), add(E, D), mulmare(E, D);                 // E *= 10, E += D, E *= D
                                                         // adica adaug la E cifra D si inmultesc nr. format cu D
    while ( comp(E, C) == 1 )     // daca E > C, adica ca si numarul format din adaugarea perechilor de cate 2 cifre
          sub(D, Z), atrh(F, B), mul(F, 2),  atrh(E, F),  Shl(E, 1),  add(E, D), mulmare(E, D);
                // atunci refac numarul, adica scad o unitate la numarul D si refac operatiile
    sub(C, E);  // fac scaderea, adica numarul format E il scad din C, care a fost numarul format din ad. celor 2 cifre

    Shl(B, 1), add(B, D);    // B *= 10, B += D , adica adaug la rezultat cifra D

    for (i = i; i ; i -= 2)  // aici merg cu un for care reprezinta pozitia de unde voi adauga cele 2 cifre
    {
        atr(E, A[i]), atr0(F), Shl(F, 1), add(F, E);   // de aici operatiile se reiau
        atr(E, A[i - 1]), Shl(F, 1), add(F, E);

        Shl(C, 2), add(C, F), atrh(F, B), mul(F, 2), atrh(E, F);

        atrh(D, C), Shr(D, 1), impmare(D, E, D);

        if (comp(D, U) == 1) atr(D, 9);

        Shl(E, 1), add(E, D), mulmare(E, D);

        while ( comp(E, C) == 1 )
              sub(D, Z), atrh(F, B), mul(F, 2),  atrh(E, F),  Shl(E, 1),  add(E, D), mulmare(E, D);

         sub(C, E);

         Shl(B, 1), add(B, D);
    }
}

int main()
{
    f >> c;

    citire(N,c);

    radical_2(N,i);

    sub(N,i);

    write(N);

    return 0;
}

--- End code ---

I want you ( or anybody who want to help me ) to run this code. But first, create a input called free.in, in the same directory with the code. ( the code is *.cpp ) Now, in the file newly created introduce next : 999192934845325420052052502005230001
( it's just a test ) . Now tell me what's the result in free.out, if you have .

[LE] And sorry for the code's commentary, it's in romanian.

Jenna:
If your code does not compile correctly or does not behave as you expect, it's either a compiler or a programming problem.

Both are not related to Code::Blocks.

C::B is not a compiler, it's "just" an IDE that calls the compiler.

Your question violates our forum rules (only C::B related questions allowed).

Topic locked !

Navigation

[0] Message Index

[*] Previous page

Go to full version