本站遷移

因為我最近租用了網路空間以及網域,
故本站已遷移至新網站~
這邊的資訊已經正在進行搬移的工作~
希望各位可以到新網站去逛XD

New Website:
http://knightzone.org/

搜尋此網誌

2011年7月30日 星期六

[Zerojudge]a021: 大數運算

利用大數四則運算即可解此題。

P.S. 雖然輸入都是正整數,但減法會出現負數。

[C++](12ms, 814KB)
#include<iostream>
using namespace std;
class bignum
{
public:
int num[1000];
int digit;
int negative;
bignum()
{
digit = 1;
for( int i = 0 ; i < 1000 ; i++ )
num[i] = 0;
negative = 0;
}
bignum( string s )
{
digit = s.length();
for( int i = 0 ; i < s.length() ; i++ )
num[i] = s[s.length()-i-1] - '0';
for( int i = s.length() ; i < 1000 ; i++ )
num[i] = 0;
negative = 0;
}
bignum operator+( bignum x )
{
bignum ans;
int max_digit = max( digit, x.digit );
for( int i = 0 ; i < max_digit ; i++ )
{
ans.num[i] += num[i] + x.num[i];
ans.num[i+1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
ans.digit = max_digit+1;
while( !ans.num[ans.digit] && ans.digit >= 0 )
ans.digit--;
if( ans.digit < 1 )
ans.digit = 1;
else
ans.digit++;
return ans;
}
bignum operator-( bignum x )
{
bignum ans;
int max_digit = max( digit, x.digit );
if( *this >= x )
{
for( int i = 0 ; i < max_digit ; i++ )
{
ans.num[i] = num[i] - x.num[i];
}
}
else
{
for( int i = 0 ; i < max_digit ; i++ )
{
ans.num[i] = x.num[i] - num[i];
}
ans.negative = 1;
}
for( int i = 0 ; i < max_digit ; i++ )
{
if( ans.num[i] < 0 )
{
ans.num[i+1]--;
ans.num[i] += 10;
}
}
ans.digit = max_digit;
while( !ans.num[ans.digit] && ans.digit >= 0 )
ans.digit--;
if( ans.digit < 1 )
ans.digit = 1;
else
ans.digit++;
return ans;
}
bignum operator*( bignum x )
{
bignum ans;
for( int i = 0 ; i < digit ; i++ )
for( int j = 0 ; j < x.digit ; j++ )
ans.num[i+j] += num[i] * x.num[j];
for( int i = 0 ; i < digit+x.digit+1 ; i++ )
{
ans.num[i+1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
ans.digit = digit+x.digit+1;
while( !ans.num[ans.digit] && ans.digit >= 0 )
ans.digit--;
if( ans.digit < 1 )
ans.digit = 1;
else
ans.digit++;
return ans;
}
bignum operator*( int x )
{
bignum ans;
for( int i = 0 ; i < digit ; i++ )
ans.num[i] += num[i] * x;
for( int i = 0 ; i < 998 ; i++ )
{
ans.num[i+1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
ans.digit = 999;
while( !ans.num[ans.digit] && ans.digit >= 0 )
ans.digit--;
if( ans.digit < 1 )
ans.digit = 1;
else
ans.digit++;
return ans;
}
bool operator>=( bignum x )
{
if( digit > x.digit )
return true;
if( digit < x.digit )
return false;
for( int i = digit ; i >= 0 ; i-- )
if( num[i] > x.num[i] )
return true;
else if( num[i] < x.num[i] )
return false;
return true;
}
bignum operator/( bignum x )
{
bignum temp("0");
bignum ans;
for( int i = digit-1 ; i >= 0 ; i-- )
{
string tempstr = "";
tempstr += (char)(num[i]+'0');
temp = temp * 10 + bignum(tempstr);
for( int j = 9 ; j > 0 ; j-- )
{
if( temp >= x*j )
{
temp = temp - x*j;
ans.num[i] = j;
break;
}
}
}
ans.digit = digit;
while( !ans.num[ans.digit] && ans.digit >= 0 )
ans.digit--;
if( ans.digit < 1 )
ans.digit = 1;
else
ans.digit++;
return ans;
}
void print()
{
if( negative )
cout << '-';
for( int i = digit-1 ; i >= 0 ; i-- )
cout << num[i];
cout << endl;
}
};
int main()
{
string a, b;
char ope;
while( cin >> a >> ope >> b )
{
bignum x(a), y(b);
if( ope == '+' )
{
(x+y).print();
}
else if( ope == '-' )
{
(x-y).print();
}
else if( ope == '*' )
{
(x*y).print();
}
else if( ope == '/' )
{
(x/y).print();
}
}
return 0;
}

0 意見:

張貼留言