字符串四则运算

1、加法

加法运算a+b=c算法:
先确定a和b中的最大位数k,然后依照由低至高位的顺序进行加法运算。
注意进位,若高位有进位,则c的长度为k+1。
源程序如下:
#include <iostream.h>
#include
main()
{

int a[240] = {0}, b[240] = {0}, c[241] = {0};

int i, ka, kb, k;

char a1[240], b1[240];

gets(a1); ka = strlen(a1);

gets(b1); kb = strlen(b1);

k = ka >= kb?ka:kb;

for(i = 0; i < ka; i++) a[i] = a1[ka-i-1] - ‘0’;

for(i = 0; i < kb; i++) b[i] = b1[kb-i-1] - ‘0’;

for(i = 0; i < k; i++)

{

c[i] = a[i] + b[i] + c[i];

c[i+1] = c[i+1] + c[i]/10;

c[i] = c[i]%10;

}

if(c[k]) k++;

for(i = k-1; i >= 0; i–) cout<<c[i];

}

#include
#include
using namespace std;

// 实现大数相加 结果存放在num中

void bigIntergerAdd(string &num, string add) {

int goBit = 0; // 存放进位

// 先交换下顺序  加数的位数要比较少
if (num.length() < add.length()) {

    string tmp = num;
    num = add;
    add = tmp;
} 

string tmp (num.length() - add.length(), '0');
add = tmp + add; 

// 利用string的+号特性  不采用逆序相加法 
int len1 = num.length(), len2 = add.length();
for (int i = len1 -1 ; i>= 0; --i) {
    
    int tmp =  ((num[i] - '0') + (add[i] - '0') + goBit) ;
    
    num[i] = tmp% 10 + '0';
    
    goBit = tmp/10;
}

// 特殊情况处理
if (goBit != 0) 
    num.insert(0, string(1, (char)goBit +'0')); 

}

int main(int argc, char** argv) {

string s1;
string result;
int i =0;
while (cin>> s1) {

    if (s1 == "0") {
        
        cout<< result<< endl;
        break;
    } 
    
    if (i ==0) {
        
        i=1;
        result = s1;
    } else 
        bigIntergerAdd(result, s1);
    
    
} 
return 0;

}
2 相乘:总的思路比较简单, 就是模拟手算。 用较短(或相等)长度的数的每一位与较长数一一相乘。要注意的是,相乘所得结果需要补0的细节 。然后就是单纯的大数相加。#include
#include
using namespace std;

// 大数相乘

string bigIntegerPlus(string res, string plusN) {

string ret; 
if (res.length()< plusN.length()) {
    
    string tmp = res;
    res = plusN;
    plusN = tmp; 
}

int len1 = res.length(), len2 = plusN.length();
for (int i = len2-1; i>=0; --i ) {
    
    string tmp(len1, '0'); // 存放相乘的中间结果 
    int goBit =0;
    for (int j= len1-1; j >=0; --j) {
    
        int mid = (res[j] -'0') * (plusN[i] -'0') + goBit;
        tmp[j] = mid%10 + '0';
        goBit = mid /10;
    }
    if (goBit != 0) 
        tmp.insert(0, string(1,goBit +'0'));
    
    for (int m=0; m< len2 -1-i; ++m)
        tmp.push_back('0'); // 补位  
    
    // 相乘后就相加  大数相加
    if (i == len2-1)
        ret = tmp;
    else {
        
        int goBit2 =0; 
        string s(tmp.length() - ret.length() ,'0');
        ret = s + ret;
        for (int m = tmp.length()-1; m>=0; --m) {
            
            int mid = (tmp[m] -'0')+(ret[m] - '0')  + goBit2;
            ret[m] = mid %10 +'0';
            goBit2 = mid/ 10;    
        }
        
        if (goBit2 != 0) 
            ret.insert(0, string(1,goBit +'0'));
    }     
} 

// 去掉前导0
while (ret.length() >1 && ret[0] == '0')
    ret.erase(0,1);
 
return ret;    

}

int main(int argc, char** argv) {

string res, plusN;
while (cin>> res>> plusN) {
    
    cout<< bigIntegerPlus(res, plusN)<< endl;
}

return 0;

}
3
实现的是大数跟
int类型的相除和求余,解题心得: 模拟手算的过程。需要注意的是。其中余数的存放要用long long存放比较好。因为如果采用int类型那么 rem = prem * 10/向后退一位/ + src[i] - ‘0’; 这行代码可能会出现溢出问题。#include
#include
using namespace std;

void bigDivision(char *src, int num, char sign) {

long long rem = 0; // 存放新余数 
long long prem = 0; // 原余数
char  res[10000] ="";
bool flag = true;
int k = 0;
for (int i=0; i< strlen(src); ++i) {
    
    rem = prem * 10/*向后退一位*/ + src[i] - '0';
    if (rem / num >0 || rem ==0) {
        
        res[k++] = rem/ num + '0';
        prem = rem %num;
        flag = false;
    }  else {
        
        prem = rem;
        if (!flag)
            res[k++] = '0';
    }
}
if (sign == '%') {
    
    cout<< prem<< endl;
    return;
}

for (int i =0; i< k; ++i) 
    cout<< res[i];
cout<< endl;

}

int main(int argc, char** argv) {

char src[10000] = "";
int num;
char sign;
while (scanf("%s %c %d", src, &sign, &num) != EOF) {
    
    bigDivision(src, num, sign);
}

return 0;

}
4
高精度问题之大数求幂,解题思路: 因为做了大数相加 ,这题也就没什么好思考的。不同之处就是先去掉小数点,计算结果后在适当位置插入小数点即可。这个算法可以计算更大的数。但必须包含小数点。。。。。。#include
#include
using namespace std;

// 求幂 思路: 先变成整数相乘 然后根据小数的位数 结合幂 算出小数点该结果字符串的位置 即可

string bigIntegerPlus(string src, string num) {

string tmp = src;
for (int i =num.length() -1; i >= 0 ; --i) {
    
    string mid(tmp.length(),'0');
    int goBit =0;
    for (int j =  tmp.length()-1; j >= 0; --j) {
        
        int tm = goBit + (tmp[j] -'0')* (num[i] - '0');
        mid[j] = tm% 10 +'0';
        goBit = tm  /10;
    }
    
    for (int q = num.length()-1; q> i; --q) 
        mid.push_back('0');
    if (goBit != 0) 
        mid.insert(0, string(1, (char)goBit +'0'));

    // 加法运算
    if (i == num.length()-1)
        src = mid;
    else {
    
        goBit =0;
        string s(mid.length() - src.length(), '0');
        src = s + src;
        for (int j = mid.length()-1; j>=0; --j) {
        
            int tm = (mid[j] - '0') +(src[j] - '0') + goBit;
            src[j] = tm %10 + '0';
            goBit = tm /10;
        }

        if (goBit !=0) 
            src.insert(0, string(1, (char)goBit +'0'));
    }    
}
return src;

}

int main(int argc, char** argv) {

string str;
while ( getline(cin, str)) {
    
    // 分割出待积数 和 幂  以及小数点位置
    int i =0;
    int index = 0;// 小数位置
    int count = 0;//幂次数
    string num;
    while ( i< str.length()) {
        
        if ( str[i] != ' ') {
        
            if (str[i] == '.')
                index = i;
            else
                num.push_back(str[i]);
            ++i;
            continue;
        }
        while ( !isdigit(str[i])) 
            ++i;
        
        if (i + 1 == str.length())
            count = str[i] - '0';
        else 
            count = (str[i] - '0') * 10 + str[i+1] - '0';        
        break;        
    }
    
    index = num.length() - index;
        
    string res = num;
    for (int i =0; i< count-1; ++i) {
    
        res = bigIntegerPlus( res, num);
    }
    index = index * count;
    
    res.insert(res.length() - index, string(".")); 
    
    while (res.length() >1 && res[0] == '0')
        res.erase(0, 1);
    
    for (int i =res.length()-1; i>=0; --i) {
        
        if (res[i] == '0' )
            res.erase(i, i+1);
        else 
            break;
    }
    cout<< res<< endl;    
}

return 0;

}

简易版
1、string add(string x, string y)
{ string ans;
int up=0, now=0, a, b;
int i=x.length()-1, j=y.length()-1;
while(i >= 0 || j >= 0)
{
if(i >= 0) a = x[i] - ‘0’;
else a = 0;
if(j >= 0) b = y[j] - ‘0’;
else b = 0;
now = (up + a + b) % 10;
up = (up + a + b) / 10;
ans.push_back(‘0’ + now);
–i; --j; }
if(up) ans.push_back(‘0’ + up);
for(int i=0; i<ans.length()/2; i++)
{ swap(ans[i], ans[ans.length()-i-1]); }
return ans; }
2、string mul(string x, string y)
{ string ans;
ans.push_back(‘0’);
for(int i=y.length()-1; i>=0; --i)
{
for(int j=0; j<y[i]-‘0’; ++j)
{ ans = add(ans, x); }
x.push_back(‘0’);
}
return ans;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值