c++高精度加法求改错……

问题描述

c++高精度加法求改错……
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1000 + 10;
int main(){
    int t, count = 1;
    cin >> t;
    while (t--){
        char m[maxn], n[maxn];
        cin >> m >> n;
        int a[maxn], b[maxn], c[maxn];
        int i, j, k,l;
        i = strlen(m); j = strlen(n);
        int leni = i; int lenj = j;
        while (i--){
            k = 0;
            a[k] = m[i] - '0';
            k++;
        }
        while (j--){
            l = 0;
            b[l] = n[j] - '0';
            l++;
        }
        int p, x = 0;
        for (p = 0; x || p < leni || p < lenj; p++){
            if (p < leni) x += a[p];
            if (p < lenj) x += b[p];
            c[p] = x % 10;
            x = x / 10;
        }
        cout << "Case " << count << ":" << endl;
        cout << m << " + " << n << " = ";
        while (p--){ cout << c[p-1]; }
        cout << endl << endl;
        count++;
    }
    return 0;
}

我试了一下,在循环体内给数组a赋值还是正常的,出了循环体就只有a[0]是对的,其他都乱了,不知道是哪里错了……

解决方案

http://www.cnblogs.com/kuangbin/archive/2011/07/22/2113836.html
http://blog.sina.com.cn/s/blog_6f6fb8260100nbg9.html

解决方案二:

你这个算法主要是用来干啥的啊,就是字符串代替数字算加法么?

封装成函数比较好:

  void add(char a[],char b[],char back[])

      {

          int i,j,k,up,x,y,z,l;

          char *c;

          if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;

          c=(char *) malloc(l*sizeof(char));

          i=strlen(a)-1;

          j=strlen(b)-1;

          k=0;up=0;

          while(i>=0||j>=0)

              {

                  if(i<0) x='0'; else x=a[i];

                  if(j<0) y='0'; else y=b[j];

                  z=x-'0'+y-'0';

                  if(up) z+=1;

                  if(z>9) {up=1;z%=10;} else up=0;

                  c[k++]=z+'0';

                  i--;j--;

              }

          if(up) c[k++]='1';

          i=0;

          c[k]='';

          for(k-=1;k>=0;k--)

              back[i++]=c[k];

          back[i]='';

      } 

解决方案三:

这个是个四则运算的版本:

 #include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
         if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数
    else if (str1.size()<str2.size()) return -1;
    else                              return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        if (str2[0]=='-') {
            sign=-1;
            str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
        } else {
            str=SUB_INT(str2,str1.erase(0,1));
        }
    } else {
        if (str2[0]=='-') {
            str=SUB_INT(str1,str2.erase(0,1));
        } else { //把两个整数对齐,短整数前面加0补齐
            string::size_type L1,L2;
            int i;
            L1=str1.size();
            L2=str2.size();
            if (L1<L2) {
                for (i=1;i<=L2-L1;i++) str1="0"+str1;
            } else {
                for (i=1;i<=L1-L2;i++) str2="0"+str2;
            }
            int int1=0,int2=0; //int2 记录进位
            for (i=str1.size()-1;i>=0;i--) {
                int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
                int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
                str=char(int1+'0')+str;
            }
            if (int2!=0) str=char(int2+'0')+str;
        }
    }
    //运算后处理符号位
    if ((sign==-1)&&(str[0]!='0')) str="-"+str;
    return str;
}
string SUB_INT(string str1,string str2) {//高精度减法
    int sign=1; //sign 为符号位
    string str;
    int i,j;
    if (str2[0]=='-') {
        str=ADD_INT(str1,str2.erase(0,1));
    } else {
        int res=compare(str1,str2);
        if (res==0) return "0";
        if (res<0) {
            sign=-1;
            string temp =str1;
            str1=str2;
            str2=temp;
        }
        string::size_type tempint;
        tempint=str1.size()-str2.size();
        for (i=str2.size()-1;i>=0;i--) {
            if (str1[i+tempint]<str2[i]) {
                j=1;
                while (1) {//zhao4zhong1添加
                    if (str1[i+tempint-j]=='0') {
                        str1[i+tempint-j]='9';
                        j++;
                    } else {
                        str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
                        break;
                    }
                }
                str=char(str1[i+tempint]-str2[i]+':')+str;
            } else {
                str=char(str1[i+tempint]-str2[i]+'0')+str;
            }
        }
        for (i=tempint-1;i>=0;i--) str=str1[i]+str;
    }
    //去除结果中多余的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str ="-"+str;
    return str;
}
string MUL_INT(string str1,string str2) {//高精度乘法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        sign*=-1;
        str1 =str1.erase(0,1);
    }
    if (str2[0]=='-') {
        sign*=-1;
        str2 =str2.erase(0,1);
    }
    int i,j;
    string::size_type L1,L2;
    L1=str1.size();
    L2=str2.size();
    for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式
        string tempstr;
        int int1=0,int2=0,int3=int(str2[i])-'0';
        if (int3!=0) {
            for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;
            for (j=L1-1;j>=0;j--) {
                int1=(int3*(int(str1[j])-'0')+int2)%10;
                int2=(int3*(int(str1[j])-'0')+int2)/10;
                tempstr=char(int1+'0')+tempstr;
            }
            if (int2!=0) tempstr=char(int2+'0')+tempstr;
        }
        str=ADD_INT(str,tempstr);
    }
    //去除结果中的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str="-"+str;
    return str;
}
string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数
    string quotient,residue; //定义商和余数
    int sign1=1,sign2=1;
    if (str2 == "0") {  //判断除数是否为0
        quotient= "ERROR!";
        residue = "ERROR!";
        if (flag==1) return quotient;
        else         return residue ;
    }
    if (str1=="0") { //判断被除数是否为0
        quotient="0";
        residue ="0";
    }
    if (str1[0]=='-') {
        str1   = str1.erase(0,1);
        sign1 *= -1;
        sign2  = -1;
    }
    if (str2[0]=='-') {
        str2   = str2.erase(0,1);
        sign1 *= -1;
    }
    int res=compare(str1,str2);
    if (res<0) {
        quotient="0";
        residue =str1;
    } else if (res == 0) {
        quotient="1";
        residue ="0";
    } else {
        string::size_type L1,L2;
        L1=str1.size();
        L2=str2.size();
        string tempstr;
        tempstr.append(str1,0,L2-1);
        for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式
            tempstr=tempstr+str1[i];
            tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
            if (tempstr.empty()) tempstr="0";//zhao4zhong1添加
            for (char ch='9';ch>='0';ch--) { //试商
                string str;
                str=str+ch;
                if (compare(MUL_INT(str2,str),tempstr)<=0) {
                    quotient=quotient+ch;
                    tempstr =SUB_INT(tempstr,MUL_INT(str2,str));
                    break;
                }
            }
        }
        residue=tempstr;
    }
    //去除结果中的前导0
    quotient.erase(0,quotient.find_first_not_of('0'));
    if (quotient.empty()) quotient="0";
    if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;
    if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;
    if (flag==1) return quotient;
    else         return residue ;
}
string DIV_INT(string str1,string str2) {//高精度除法,返回商
    return DIVIDE_INT(str1,str2,1);
}
string MOD_INT(string str1,string str2) {//高精度除法,返回余数
    return DIVIDE_INT(str1,str2,0);
}
int main() {
    char ch;
    string s1,s2,res;

    while (cin>>s1>>ch>>s2) {
        switch (ch) {
            case '+':res=ADD_INT(s1,s2);break;
            case '-':res=SUB_INT(s1,s2);break;
            case '*':res=MUL_INT(s1,s2);break;
            case '/':res=DIV_INT(s1,s2);break;
            case '%':res=MOD_INT(s1,s2);break;
            default :                   break;
        }
        cout<<res<<endl;
    }
    return(0);
}

解决方案四:

传给函数的只是第一位,所以返回的只有第一位。最简单做法就是将数组开在最开始(头文件后面)

时间: 2024-12-22 00:55:30

c++高精度加法求改错……的相关文章

c-C++高精度乘法求改错。。

问题描述 C++高精度乘法求改错.. 写了好久的高精度乘法 就是一直错,求改错(不要其他高精乘代码复制过来) 比较逗的事情是,我的这个代码拿去交高精乘Wrong answer 直接拿去交高精加就AC了.. #include #define len 20000 using namespace std; string s1,s2; void init() { getline(cin,s1); getline(cin,s2); } string add(string sx,string sy) { i

c语言题目二进制加法求指教

问题描述 c语言题目二进制加法求指教 由键盘输入两个二进制正整数(均不超过2的31次方),计算输出它们的和(结果同样以二进制表示).注:本题以字符串方式读取数据时,务必使用scanf(""%s"" ....)的方式 输入格式 共两行,一行一个二进制正整数(务必使用scanf(""%s"" ....)的方式,以确保读入的串末尾不会含有空格及其它特殊字符)输出格式 二进制形式的和输入样例 110110输出样例 1111 解决方案

c++问题-求改错,谢谢啦,老师留的问题

问题描述 求改错,谢谢啦,老师留的问题 ??建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名.学号.性别.年龄.还有以下两个成员函数:一个用于初始化学生姓名.学号.性别和年龄的构造函数,一个用于输出学生信息的函数.编写一个主函数.声明一个学学生对象.然后调用成员函数在屏幕输出学生信息. ? 解决方案 Student::Student()那行末尾分号去掉. 解决方案二: 求改错 解决方案三: 在Student::Student()之前加: }; 解决方案四: int a);这里

javascript-jquery的slideToggle方法的实现问题,求改错没法显示

问题描述 jquery的slideToggle方法的实现问题,求改错没法显示 <div class="serlist_box serlist_box_even" id="<?php echo $value["id"]; ?>"> <ul class="serlist_box_inner clearfix"> <li class="serlist_bd_station serl

使用C++的string实现高精度加法运算的实例代码_C 语言

对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算. 本文讨论借助C++的string来实现高精度的运算. 首先输入的量直接存储为string,设为s1和s2. 接下来设计一个反转函数,用于把整个字符串反转(为了方便后续计算). string reverseStr(string input){ string output = ""; for(int i = 0; i < input.length(); i++){

高精度加法和乘法

今天偶然看了一下某大神的模板,不经意翻到这个就顺便"借"了一下 上代码吧: /* Date : 2015-8-21 晚上 Author : ITAK Motto : 今日的我要超越昨日的我,明日的我要胜过今日的我: 以创作出更好的代码为目标,不断地超越自己. */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; /** 如何用: 1.变量声明:

java 写 高精度加法 HDU1002

import java.util.*; import java.math.*; import java.io.*; public class Main { public static void main( String[] args ) { Scanner cin=new Scanner(new BufferedInputStream (System.in) ); BigInteger a,b,c; int t,num=0; t=cin.nextInt(); while( t-->=1 ) {

c++加法高精度算法的简单实现_C 语言

c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就是把数组编程字符串,然后将字符串像竖式一样加起来: a+b高精度算法 #include <iostream> #include <cmath> #include <cstring> using namespace std; int main() { char a[10001

c++-求份C++运算器,需要基本云运算关系运算逻辑运算位运算进制转换功能

问题描述 求份C++运算器,需要基本云运算关系运算逻辑运算位运算进制转换功能 1基本运算功能 主要包括:加.减,乘.除.取余.自增.自减等. 2.关系运算功能 主要包括:大于.大等于.小于.小等于.等于.不等于. 3. 逻辑运算功能 主要包括:与.或.非. 4.位运算功能 主要包括:按位与.按位或.按位异或.按位取反.左移和右移. 5.进制转换功能 主要包括:包括十进制转其他进制.二进制转其他进制 解决方案 我这个别处找的代码,不是我写的.. 解决方案二: http://download.csd