用c语言数组计算两个数的四则运算,考虑两个数非常大的情况
展开全部
我有C++版本,不知道楼主愿意否?贴出来给你参考一下吧
#include<iostream>
#include<vector>
#include<string>
using namespace std;
void strToIntArray(const string &str,vector<int> &vec)
{//数字串转换为整型数组,最高位在右边,便于计算
size_t size = str.size();
if(vec.size() != size)
vec.resize(size);
for(vector<int>::size_type index = 0;index != vec.size();++index)
vec[index] = str[size - index - 1] - '0';
}
void toInteger(vector<int> & vec)
{//对整型数组进行进制和去掉前面的0等处理
size_t size = vec.size();
if(vec.back() >= 9)
{
vec.resize(size + 1);
++size;
}
for(vector<int>::size_type index = 0;index != size;++index)
{
if(vec[index] > 9)
{
vec[index + 1] += vec[index] / 10;
vec[index] %= 10;
}
}
while(size > 1 && vec[size - 1] == 0) --size;//去掉前面的0
vec.resize(size);
}
string intArrayToStr(vector<int> &vec)
{//将整型数组转换为数字串
string str;
for(vector<int>::size_type index = vec.size() - 1;index != 0;--index)
{
char ch = vec[index] + 48;
str.push_back(ch);
}
str.push_back((char)(vec[0] + 48));
return str;
}
string add(const string &s1,const string &s2)
{//高精度加法
size_t size1 = s1.size(),size2 = s2.size();
vector<int> v1,v2;
strToIntArray(s1,v1);strToIntArray(s2,v2);//转换为整型数组
if(size1 < size2)
{//若s2位数多
v1.resize(size2);
for(vector<int>::size_type i = size1;i != size2;++i)
v1[i] = 0;
}
else
{//若s1位数多
v2.resize(size1);
for(vector<int>::size_type i = size2;i != size1;++i)
v2[i] = 0;
}
for(vector<int>::size_type i = 0;i != v1.size();++i)
v1[i] = v1[i] + v2[i];//整型数组相加
toInteger(v1);//归整
return intArrayToStr(v1);//再次转换为数字串并返回
}
string sub(const string &s1,const string &s2)
{//高精度减法
string::size_type pos;
if((pos = s1.find_first_of("123456789")) == string::npos)
const_cast<string&>(s1) = "0";//排除纯0数字串,如"0...00"
else const_cast<string&>(s1) = s1.substr(pos);
bool small_big = false;
if( (s1.size() < s2.size()) || (s1.size() == s2.size() && s1 < s2))
{//若被减数小于减数,则交换两数
string stemp = s1;
const_cast<string&>(s1) = s2;
const_cast<string&>(s2)= stemp;
small_big = true;//记录,表明结果是否需要加上‘-’
}
vector<int> v1,v2;
strToIntArray(s1,v1);strToIntArray(s2,v2);
size_t size = v1.size();
v2.resize(size);//v2的长度不可能大于v1
for(vector<int>::size_type i = v2.size();i != size;++i)
v2[i] = 0;//v2前导补0
for(vector<int>::size_type i = 0;i != size;++i)
if(v1[i] >= v2[i]) v1[i] = v1[i] - v2[i];
else
{//不够减,则借位
v1[i] = v1[i] - v2[i] + 10;
--v1[i + 1];
}
while(size > 1 && v1[size - 1] == 0) --size;//去掉前面多余的0
v1.resize(size);
string _stemp = intArrayToStr(v1);
if(small_big) _stemp = '-' + _stemp;//加上‘-’
return _stemp;
}
string mul(const string &s1,const string &s2)
{//高精度乘法
size_t size1 = s1.size(),size2 = s2.size(),size = size1 + size2;
vector<int> v1,v2,vprod(size);//vprod的存储乘积
strToIntArray(s1,v1);strToIntArray(s2,v2);
//首先计算被乘数和乘数各位的积,存到vprod中,在计算与十位的乘积,
//把结果退以为加到vprod中,vprod下标规律为i + j。
for(vector<int>::size_type i = 0;i != size2;++i)
for(vector<int>::size_type j = 0;j != size1;++j)
vprod[i + j] = vprod[i + j] + v2[i] * v1[j];
toInteger(vprod);
return intArrayToStr(vprod);
}
void div(const string &s1,const string &s2,string &q,string &r)
{//高精度除法
if(s2 == "0")
{//除数若为0
cout << "Error ! ";
return ;
}
size_t size1 = s1.size(),size2 = s2.size(),size;
if( (size1 < size2) || (size1 == size2 && s1 < s2))
{//被除数若小于除数
q = "0";
r = s1;
}
else
{//被除数大于或者等于除数
int temp;
string::size_type pos;
for(string::size_type i = 0;i != size1;++i)
{//试除,一位一位的增加余数
temp = 0;
r.push_back(s1[i]);
if((pos = r.find_first_of("123456789")) == string::npos) r = "0";
else r = r.substr(pos);//排除纯0数字串,如"0...00"
size = r.size();
while((size > size2) || (size == size2 && r >= s2))
{//若余数大于除数
r = sub(r,s2);//余数减去除数
size = r.size();
++temp;//商自增1
}
q.push_back(temp + '0');
}
if(( pos = q.find_first_of("123456789") ) != string::npos) q = q.substr(pos);
else q = "0";//去掉商前面的0
}
}
#include<iostream>
#include<vector>
#include<string>
using namespace std;
void strToIntArray(const string &str,vector<int> &vec)
{//数字串转换为整型数组,最高位在右边,便于计算
size_t size = str.size();
if(vec.size() != size)
vec.resize(size);
for(vector<int>::size_type index = 0;index != vec.size();++index)
vec[index] = str[size - index - 1] - '0';
}
void toInteger(vector<int> & vec)
{//对整型数组进行进制和去掉前面的0等处理
size_t size = vec.size();
if(vec.back() >= 9)
{
vec.resize(size + 1);
++size;
}
for(vector<int>::size_type index = 0;index != size;++index)
{
if(vec[index] > 9)
{
vec[index + 1] += vec[index] / 10;
vec[index] %= 10;
}
}
while(size > 1 && vec[size - 1] == 0) --size;//去掉前面的0
vec.resize(size);
}
string intArrayToStr(vector<int> &vec)
{//将整型数组转换为数字串
string str;
for(vector<int>::size_type index = vec.size() - 1;index != 0;--index)
{
char ch = vec[index] + 48;
str.push_back(ch);
}
str.push_back((char)(vec[0] + 48));
return str;
}
string add(const string &s1,const string &s2)
{//高精度加法
size_t size1 = s1.size(),size2 = s2.size();
vector<int> v1,v2;
strToIntArray(s1,v1);strToIntArray(s2,v2);//转换为整型数组
if(size1 < size2)
{//若s2位数多
v1.resize(size2);
for(vector<int>::size_type i = size1;i != size2;++i)
v1[i] = 0;
}
else
{//若s1位数多
v2.resize(size1);
for(vector<int>::size_type i = size2;i != size1;++i)
v2[i] = 0;
}
for(vector<int>::size_type i = 0;i != v1.size();++i)
v1[i] = v1[i] + v2[i];//整型数组相加
toInteger(v1);//归整
return intArrayToStr(v1);//再次转换为数字串并返回
}
string sub(const string &s1,const string &s2)
{//高精度减法
string::size_type pos;
if((pos = s1.find_first_of("123456789")) == string::npos)
const_cast<string&>(s1) = "0";//排除纯0数字串,如"0...00"
else const_cast<string&>(s1) = s1.substr(pos);
bool small_big = false;
if( (s1.size() < s2.size()) || (s1.size() == s2.size() && s1 < s2))
{//若被减数小于减数,则交换两数
string stemp = s1;
const_cast<string&>(s1) = s2;
const_cast<string&>(s2)= stemp;
small_big = true;//记录,表明结果是否需要加上‘-’
}
vector<int> v1,v2;
strToIntArray(s1,v1);strToIntArray(s2,v2);
size_t size = v1.size();
v2.resize(size);//v2的长度不可能大于v1
for(vector<int>::size_type i = v2.size();i != size;++i)
v2[i] = 0;//v2前导补0
for(vector<int>::size_type i = 0;i != size;++i)
if(v1[i] >= v2[i]) v1[i] = v1[i] - v2[i];
else
{//不够减,则借位
v1[i] = v1[i] - v2[i] + 10;
--v1[i + 1];
}
while(size > 1 && v1[size - 1] == 0) --size;//去掉前面多余的0
v1.resize(size);
string _stemp = intArrayToStr(v1);
if(small_big) _stemp = '-' + _stemp;//加上‘-’
return _stemp;
}
string mul(const string &s1,const string &s2)
{//高精度乘法
size_t size1 = s1.size(),size2 = s2.size(),size = size1 + size2;
vector<int> v1,v2,vprod(size);//vprod的存储乘积
strToIntArray(s1,v1);strToIntArray(s2,v2);
//首先计算被乘数和乘数各位的积,存到vprod中,在计算与十位的乘积,
//把结果退以为加到vprod中,vprod下标规律为i + j。
for(vector<int>::size_type i = 0;i != size2;++i)
for(vector<int>::size_type j = 0;j != size1;++j)
vprod[i + j] = vprod[i + j] + v2[i] * v1[j];
toInteger(vprod);
return intArrayToStr(vprod);
}
void div(const string &s1,const string &s2,string &q,string &r)
{//高精度除法
if(s2 == "0")
{//除数若为0
cout << "Error ! ";
return ;
}
size_t size1 = s1.size(),size2 = s2.size(),size;
if( (size1 < size2) || (size1 == size2 && s1 < s2))
{//被除数若小于除数
q = "0";
r = s1;
}
else
{//被除数大于或者等于除数
int temp;
string::size_type pos;
for(string::size_type i = 0;i != size1;++i)
{//试除,一位一位的增加余数
temp = 0;
r.push_back(s1[i]);
if((pos = r.find_first_of("123456789")) == string::npos) r = "0";
else r = r.substr(pos);//排除纯0数字串,如"0...00"
size = r.size();
while((size > size2) || (size == size2 && r >= s2))
{//若余数大于除数
r = sub(r,s2);//余数减去除数
size = r.size();
++temp;//商自增1
}
q.push_back(temp + '0');
}
if(( pos = q.find_first_of("123456789") ) != string::npos) q = q.substr(pos);
else q = "0";//去掉商前面的0
}
}
更多追问追答
追问
不会这么麻烦的,我们新接触数组,留得难度略高的作业题,不会这么麻烦的
追答
刚接触数组是吧,那这个你应该懂不了了,不过这里的vector其实也就是数组,只不过比数组更好用。前面三个函数我想你应该还是用的着的,大整数得用字符串存,那么首先得要将它换成整型数组,运算之后还要进行进制和格式处理。
后面加减乘除能看懂就看吧,看不懂就算了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询