Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15040   Accepted: 7737

Description

Bulls are so much better at math than the cows. They can multiply huge integers together and get perfectly precise answers ... or so they say. Farmer John wonders if their answers are correct. Help him check the bulls' answers.
Read in two positive integers (no more than 40 digits each) and compute their product. Output it as a normal number (with no extra leading zeros).

FJ asks that you do this yourself; don't use a special library function for the multiplication.

Input

* Lines 1..2: Each line contains a single decimal number.

Output

* Line 1: The exact product of the two input lines

Sample Input

11111111111111
1111111111

Sample Output

12345679011110987654321

Source

USACO 2004 November


问题链接:POJ2389 Bull Math

问题简述:输入两个正整数,它们不超过40位,计算它们的乘积。

问题分析:这是一个大整数计算问题,可以用一个大整数类来实现。

程序说明:编译的时候需要使用G++编译器。求整数绝对值的函数abs()需要用C语言库stdlib.h中的函数,否则会出问题。该问题只用到了乘法运算,为了代码的简洁,可以将不需要的代码删除。这里使用了一个完整的大整数运算类,也可以用于其他地方。

参考链接:B00008 C++实现的大整数计算(一)

AC的C++语言程序如下:

/* POJ2389 Bull Math */

#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib> #define MAX 100 // for strings using namespace std; class BigInteger {
private:
string number;
bool sign;
public:
BigInteger(); // empty constructor initializes zero
BigInteger(string s); // "string" constructor
BigInteger(string s, bool sin); // "string" constructor
BigInteger(int n); // "int" constructor
void setNumber(string s);
const string& getNumber(); // retrieves the number
void setSign(bool s);
const bool& getSign();
BigInteger absolute(); // returns the absolute value
void operator = (BigInteger b);
bool operator == (BigInteger b);
bool operator != (BigInteger b);
bool operator > (BigInteger b);
bool operator < (BigInteger b);
bool operator >= (BigInteger b);
bool operator <= (BigInteger b);
BigInteger& operator ++(); // prefix
BigInteger operator ++(int); // postfix
BigInteger& operator --(); // prefix
BigInteger operator --(int); // postfix
BigInteger operator + (BigInteger b);
BigInteger operator - (BigInteger b);
BigInteger operator * (BigInteger b);
BigInteger operator / (BigInteger b);
BigInteger operator % (BigInteger b);
BigInteger& operator += (BigInteger b);
BigInteger& operator -= (BigInteger b);
BigInteger& operator *= (BigInteger b);
BigInteger& operator /= (BigInteger b);
BigInteger& operator %= (BigInteger b);
BigInteger& operator [] (int n);
BigInteger operator -(); // unary minus sign
operator string(); // for conversion from BigInteger to string
private:
bool equals(BigInteger n1, BigInteger n2);
bool less(BigInteger n1, BigInteger n2);
bool greater(BigInteger n1, BigInteger n2);
string add(string number1, string number2);
string subtract(string number1, string number2);
string multiply(string n1, string n2);
pair<string, long long> divide(string n, long long den);
string toString(long long n);
long long toInt(string s);
}; //------------------------------------------------------------------------------ BigInteger::BigInteger() { // empty constructor initializes zero
number = "0";
sign = false;
} BigInteger::BigInteger(string s) { // "string" constructor
if( isdigit(s[0]) ) { // if not signed
setNumber(s);
sign = false; // +ve
} else {
setNumber( s.substr(1) );
sign = (s[0] == '-');
}
} BigInteger::BigInteger(string s, bool sin) { // "string" constructor
setNumber( s );
setSign( sin );
} BigInteger::BigInteger(int n) { // "int" constructor
stringstream ss;
string s;
ss << n;
ss >> s; if( isdigit(s[0]) ) { // if not signed
setNumber( s );
setSign( false ); // +ve
} else {
setNumber( s.substr(1) );
setSign( s[0] == '-' );
}
} void BigInteger::setNumber(string s) {
number = s;
} const string& BigInteger::getNumber() { // retrieves the number
return number;
} void BigInteger::setSign(bool s) {
sign = s;
} const bool& BigInteger::getSign() {
return sign;
} BigInteger BigInteger::absolute() {
return BigInteger( getNumber() ); // +ve by default
} void BigInteger::operator = (BigInteger b) {
setNumber( b.getNumber() );
setSign( b.getSign() );
} bool BigInteger::operator == (BigInteger b) {
return equals((*this) , b);
} bool BigInteger::operator != (BigInteger b) {
return ! equals((*this) , b);
} bool BigInteger::operator > (BigInteger b) {
return greater((*this) , b);
} bool BigInteger::operator < (BigInteger b) {
return less((*this) , b);
} bool BigInteger::operator >= (BigInteger b) {
return equals((*this) , b)
|| greater((*this), b);
} bool BigInteger::operator <= (BigInteger b) {
return equals((*this) , b)
|| less((*this) , b);
} BigInteger& BigInteger::operator ++() { // prefix
(*this) = (*this) + 1;
return (*this);
} BigInteger BigInteger::operator ++(int) { // postfix
BigInteger before = (*this); (*this) = (*this) + 1; return before;
} BigInteger& BigInteger::operator --() { // prefix
(*this) = (*this) - 1;
return (*this); } BigInteger BigInteger::operator --(int) { // postfix
BigInteger before = (*this); (*this) = (*this) - 1; return before;
} BigInteger BigInteger::operator + (BigInteger b) {
BigInteger addition;
if( getSign() == b.getSign() ) { // both +ve or -ve
addition.setNumber( add(getNumber(), b.getNumber() ) );
addition.setSign( getSign() );
} else { // sign different
if( absolute() > b.absolute() ) {
addition.setNumber( subtract(getNumber(), b.getNumber() ) );
addition.setSign( getSign() );
} else {
addition.setNumber( subtract(b.getNumber(), getNumber() ) );
addition.setSign( b.getSign() );
}
}
if(addition.getNumber() == "0") // avoid (-0) problem
addition.setSign(false); return addition;
} BigInteger BigInteger::operator - (BigInteger b) {
b.setSign( ! b.getSign() ); // x - y = x + (-y)
return (*this) + b;
} BigInteger BigInteger::operator * (BigInteger b) {
BigInteger mul; mul.setNumber( multiply(getNumber(), b.getNumber() ) );
mul.setSign( getSign() != b.getSign() ); if(mul.getNumber() == "0") // avoid (-0) problem
mul.setSign(false); return mul;
} // Warning: Denomerator must be within "long long" size not "BigInteger"
BigInteger BigInteger::operator / (BigInteger b) {
long long den = toInt( b.getNumber() );
BigInteger div; div.setNumber( divide(getNumber(), den).first );
div.setSign( getSign() != b.getSign() ); if(div.getNumber() == "0") // avoid (-0) problem
div.setSign(false); return div;
} // Warning: Denomerator must be within "long long" size not "BigInteger"
BigInteger BigInteger::operator % (BigInteger b) {
long long den = toInt( b.getNumber() ); BigInteger rem;
long long rem_int = divide(number, den).second;
rem.setNumber( toString(rem_int) );
rem.setSign( getSign() != b.getSign() ); if(rem.getNumber() == "0") // avoid (-0) problem
rem.setSign(false); return rem;
} BigInteger& BigInteger::operator += (BigInteger b) {
(*this) = (*this) + b;
return (*this);
} BigInteger& BigInteger::operator -= (BigInteger b) {
(*this) = (*this) - b;
return (*this);
} BigInteger& BigInteger::operator *= (BigInteger b) {
(*this) = (*this) * b;
return (*this);
} BigInteger& BigInteger::operator /= (BigInteger b) {
(*this) = (*this) / b;
return (*this);
} BigInteger& BigInteger::operator %= (BigInteger b) {
(*this) = (*this) % b;
return (*this);
} BigInteger& BigInteger::operator [] (int n) {
return *(this + (n*sizeof(BigInteger)));
} BigInteger BigInteger::operator -() { // unary minus sign
return (*this) * -1;
} BigInteger::operator string() { // for conversion from BigInteger to string
string signedString = ( getSign() ) ? "-" : ""; // if +ve, don't print + sign
signedString += number;
return signedString;
} bool BigInteger::equals(BigInteger n1, BigInteger n2) {
return n1.getNumber() == n2.getNumber()
&& n1.getSign() == n2.getSign();
} bool BigInteger::less(BigInteger n1, BigInteger n2) {
bool sign1 = n1.getSign();
bool sign2 = n2.getSign(); if(sign1 && ! sign2) // if n1 is -ve and n2 is +ve
return true; else if(! sign1 && sign2)
return false; else if(! sign1) { // both +ve
if(n1.getNumber().length() < n2.getNumber().length() )
return true;
if(n1.getNumber().length() > n2.getNumber().length() )
return false;
return n1.getNumber() < n2.getNumber();
} else { // both -ve
if(n1.getNumber().length() > n2.getNumber().length())
return true;
if(n1.getNumber().length() < n2.getNumber().length())
return false;
return n1.getNumber().compare( n2.getNumber() ) > 0; // greater with -ve sign is LESS
}
} bool BigInteger::greater(BigInteger n1, BigInteger n2) {
return ! equals(n1, n2) && ! less(n1, n2);
} string BigInteger::add(string number1, string number2) {
string add = (number1.length() > number2.length()) ? number1 : number2;
char carry = '0';
int differenceInLength = abs( (int) (number1.size() - number2.size()) ); if(number1.size() > number2.size())
number2.insert(0, differenceInLength, '0'); // put zeros from left else// if(number1.size() < number2.size())
number1.insert(0, differenceInLength, '0'); for(int i=number1.size()-1; i>=0; --i) {
add[i] = ((carry-'0')+(number1[i]-'0')+(number2[i]-'0')) + '0'; if(i != 0) {
if(add[i] > '9') {
add[i] -= 10;
carry = '1';
} else
carry = '0';
}
}
if(add[0] > '9') {
add[0]-= 10;
add.insert(0,1,'1');
}
return add;
} string BigInteger::subtract(string number1, string number2) {
string sub = (number1.length()>number2.length())? number1 : number2;
int differenceInLength = abs( (int)(number1.size() - number2.size()) ); if(number1.size() > number2.size())
number2.insert(0, differenceInLength, '0'); else
number1.insert(0, differenceInLength, '0'); for(int i=number1.length()-1; i>=0; --i) {
if(number1[i] < number2[i]) {
number1[i] += 10;
number1[i-1]--;
}
sub[i] = ((number1[i]-'0')-(number2[i]-'0')) + '0';
} while(sub[0]=='0' && sub.length()!=1) // erase leading zeros
sub.erase(0,1); return sub;
} string BigInteger::multiply(string n1, string n2) {
if(n1.length() > n2.length())
n1.swap(n2); string res = "0";
for(int i=n1.length()-1; i>=0; --i) {
string temp = n2;
int currentDigit = n1[i]-'0';
int carry = 0; for(int j=temp.length()-1; j>=0; --j) {
temp[j] = ((temp[j]-'0') * currentDigit) + carry; if(temp[j] > 9) {
carry = (temp[j]/10);
temp[j] -= (carry*10);
} else
carry = 0; temp[j] += '0'; // back to string mood
} if(carry > 0)
temp.insert(0, 1, (carry+'0')); temp.append((n1.length()-i-1), '0'); // as like mult by 10, 100, 1000, 10000 and so on res = add(res, temp); // O(n)
} while(res[0] == '0' && res.length()!=1) // erase leading zeros
res.erase(0,1); return res;
} pair<string, long long> BigInteger::divide(string n, long long den) {
long long rem = 0;
string result;
result.resize(MAX); for(int indx=0, len = n.length(); indx<len; ++indx) {
rem = (rem * 10) + (n[indx] - '0');
result[indx] = rem / den + '0';
rem %= den;
}
result.resize( n.length() ); while( result[0] == '0' && result.length() != 1)
result.erase(0,1); if(result.length() == 0)
result = "0"; return make_pair(result, rem);
} string BigInteger::toString(long long n) {
stringstream ss;
string temp; ss << n;
ss >> temp; return temp;
} long long BigInteger::toInt(string s) {
long long sum = 0; for(int i=0; i<(int)s.length(); i++)
sum = (sum*10) + (s[i] - '0'); return sum;
} int main()
{
string a, b;
BigInteger bia, bib, bic; while(cin >> a >> b) {
bia.setNumber(a);
bib.setNumber(b); bic = bia * bib; cout << bic.getNumber() << endl;
} return 0;
}

转载于:https://www.cnblogs.com/tigerisland/p/7564133.html

POJ2389 Bull Math【大数】的更多相关文章

  1. POJ2389 Bull Math

    /* POJ2389 Bull Math http://poj.org/problem?id=2389 高精度乘法 * */ #include <cstring> #include < ...

  2. [PKU2389]Bull Math (大数运算)

    Description Bulls are so much better at math than the cows. They can multiply huge integers together ...

  3. Poj OpenJudge 百练 2389 Bull Math

    1.Link: http://poj.org/problem?id=2389 http://bailian.openjudge.cn/practice/2389/ 2.Content: Bull Ma ...

  4. BZOJ1754: [Usaco2005 qua]Bull Math

    1754: [Usaco2005 qua]Bull Math Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 374  Solved: 227[Submit ...

  5. 1754: [Usaco2005 qua]Bull Math

    1754: [Usaco2005 qua]Bull Math Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 398  Solved: 242[Submit ...

  6. POJ 2389 Bull Math(水~Java -大数相乘)

    题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...

  7. BZOJ 1754: [Usaco2005 qua]Bull Math

    Description Bulls are so much better at math than the cows. They can multiply huge integers together ...

  8. poj 2389.Bull Math 解题报告

    题目链接:http://poj.org/problem?id=2389 题目意思:就是大整数乘法. 题目中说每个整数不超过 40 位,是错的!!!要开大点,这里我开到100. 其实大整数乘法还是第一次 ...

  9. 【BZOJ】1754: [Usaco2005 qua]Bull Math

    [算法]高精度乘法 #include<cstdio> #include<algorithm> #include<cstring> using namespace s ...

随机推荐

  1. Three.js 中的参数调试控制插件dat.GUI.JS - [Three.js] - [dat.GUI]

    不论是处于特殊功能的需要,还是处于效果调试方便,我们可能都需要修改模型中的参数值.在Three.js中,谷歌提供了一个js库,即dat.GUI.js用于处理这种需求. 通过该库,我们就不需要通过手动修 ...

  2. 典型的MVC架构图

    通常,当使用MVC时,应用程序中的每个逻辑部分都有一个单一的控制器.在这些控制器的前面还有一个Router:这是一个看门人,用于确定用户请求的内容,以便应用程序满足用户需要.常用php的mvc框架:Y ...

  3. JAVA中使用使Math 类操作数据

    转自:https://www.imooc.com/code/2342 侵删! Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用 ...

  4. Python常见数据结构-Set集合

    集合基本特点 集合是无序的,且集合内无重复值. 集合不支持索引和切片 集合常见操作及方法 s1 = {1,2,3} s2 = {2,3,4} s1.add(4) #.add()方法添加一个元素 s1. ...

  5. POj3017 dp+单调队列优化

    传送门 解题思路: 大力推公式:dp[i]=min(dp[k]+max(k+1,i)){k>=0&&k<i},max(j,i)记为max(a[h]){h>k& ...

  6. networkx学习与攻击转移图可视化

    接到一个任务,将攻击转移矩阵进行可视化,生成攻击转移概率图,便尝试用python实现一下. 查阅资料,看大家都在用networkx和matplotlib进行可视化,便边学边做,记录一下学习笔记. 任务 ...

  7. 浅谈ArrayList

    浅谈ArrayList 废话不多说(事实是不会说),让我们直接进入正题 首先讲一讲最基本的ArrayList的初始化,也就是我们常说的构造函数,ArrayList给我们提供了三种构造方式,我们逐个来查 ...

  8. 从python爬虫以及数据可视化的角度来为大家呈现“227事件”后,肖战粉丝的数据图

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取t.cn ...

  9. R - Cow and Message CodeForces - 1307C

    思路对了,但是不会写. 等差数列长度不是1就是2,所以不是一个字母就是俩字母,一开始写的时候直接枚举两个字母,然后让次数相乘.这样是不对的,比如abaabb,字母ab的个数应该是3+2+2,因该是每一 ...

  10. Python - 批量获取文件夹的大小输出为文件格式化保存

    很多时候,查看一个文件夹下的每个文件大小可以轻易的做到,因为文件后面就是文件尺寸,但是如果需要查看一个文件夹下面所有的文件夹对应的尺寸,就发现需要把鼠标放到对应的文件夹上,稍等片刻才会出结果. 有时候 ...