← Back to topics
Topic

z-koren

m
matteo123
Can I get sme help, please.
here is a code:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const int MaxDig = 1001;

struct bignum {
int dig[ MaxDig ];
int brDig;
bignum () {
memset ( dig, 0, sizeof ( dig ) );
brDig = 1;
}
bignum ( int A ) {
memset ( dig, 0, sizeof ( dig ) );
if ( A == 0 ) {
brDig = 1;
}
else {
brDig = 0;
while ( A ) {
dig[ brDig++ ] = A % 10;
A /= 10;
}
}
}
bignum ucitaj ( void ) {
bignum veliki;
int N;
scanf ( "%d", &N );
for ( int i = 0 ; i < N ; ++i ) {
scanf ( "%d", &dig[ i ] );
veliki.dig[ i ] = dig[ i ];
}
return veliki;
}
void IzbrisiNule ( void ) {
while ( brDig > 1 ) {
if ( dig[ brDig - 1 ] > 0 ) {
break;
}
else {
--brDig;
}
}
}
bignum operator+ ( const bignum& B ) {
bignum ret;
int carry = 0;
int length = max ( brDig, B.brDig );
for ( int i = 0 ; i < length ; ++i ) {
ret.dig[ i ] = ( dig[ i ] + B.dig[ i ] + carry ) % 10;
carry = ( dig[ i ] + B.dig[ i ] + carry ) / 10;
}
if ( carry > 0 ) {
ret.dig[ brDig++ ] = carry;
}
return ret;
}
bignum operator- ( const bignum& B ) {
bignum ret;
int carry = 0;
int length = max ( brDig, B.brDig );
for ( int i = 0 ; i < length ; ++i ) {
dig[ i ] -= carry;
if ( dig[ i ] < B.dig[ i ] ) {
dig[ i ] += 10;
ret.dig[ i ] = ( dig[ i ] - B.dig[ i ] );
carry = 1;
}
else {
ret.dig[ i ] = ( dig[ i ] - B.dig[ i ] );
carry = 0;
}
}
return ret;
}
bignum operator* ( const bignum& B ) {
bignum ret;
bignum tmp;
int carry = 0;
for ( int i = 0 ; i < brDig ; ++i ) {
tmp = 0;
carry = 0;
tmp.brDig = B.brDig + i;
for ( int j = 0 ; j < B.brDig ; ++j ) {
tmp.dig[ i + j ] = ( dig[ i ] * dig[ j ] + carry ) % 10;
carry = ( dig[ i ] * dig[ j ] + carry ) / 10;
}
if ( carry > 0 ) {
tmp.dig[ brDig++ ] = carry;
}
ret = ret + tmp;
}
return ret;
}
bignum operator/ ( int div ) {
bignum ret;
int carry = 0, k;
for ( int i = brDig - 1 ; i >= 0 ; --i ) {
carry *= 10;
k = ( carry + dig[ i ] ) % div;
ret.dig[ i ] = ( carry + dig[ i ] ) / div;
carry = k;
}
IzbrisiNule ();
return ret;
}
bool operator< ( const bignum& B ) {
if ( brDig < B.brDig ) {
return true;
}
if ( brDig > B.brDig ) {
return false;
}
for ( int i = brDig - 1 ; i >= 0 ; --i ) {
if ( dig[ i ] != B.dig[ i ] ) {
return dig[ i ] < B.dig[ i ];
}
}
}
bool operator== ( const bignum& B ) {
if ( brDig != B.brDig ) {
return false;
}
for ( int i = 0 ; i < brDig ; ++i ) {
if ( dig[ i ] != B.dig[ i ] ) {
return false;
}
}
return true;
}
bignum BinarySearch ( void ) {
bignum low = 1;
bignum high = ucitaj();
bignum broj = high;
bignum middle;
while ( low < high ) {
middle = ( high + low ) / 2;
return high;
if ( middle * middle < broj ) {
low = middle + 1;
}
else {
high = middle;
}
}
return low;
}
void ispisi ( void ) {
bignum ret = BinarySearch();
printf ( "%d\n", ret.brDig );
for ( int i = ret.brDig - 1 ; i >= 0 ; --i ) {
printf ( "%d\n", ret.dig[ i ] );
}
}
}BigNum;

int main() {
BigNum.ispisi();
return 0;
}

h
halil
Test operators. For example, the operator +:
bignum operator + (const B & bignum) (
bignum ret;
int carry = 0;
int length = max (brDig, B.brDig);
I think you should insert line:
ret.brDig = length;
etc...
h
halil
Try with better starting lo and hi variables
or
BASE 100000000
m
matteo123
how do you think [quote]Try with better starting lo and hi variables[/quote]
m
matteo123
what now, I don't know where is error. I get MLE