| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5128 人关注过本帖
标题:两个大数相加
只看楼主 加入收藏
ls120535021
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-8
收藏
 问题点数:0 回复次数:6 
两个大数相加
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream.h>
#define MAX 400
void my_read(int *a) //对操作数进行处理(倒序排列数组,便于运算)
{
    int len,i,flag=0;
    char s[MAX];
aa:
    while(1)
    {
        scanf("%s",&s);
        len=strlen(s);
        if (s[0]=='-'){
            printf("输入错误:操作数不为负数");
            goto aa;
        }
        for(i=len;i>=1;i--)
        {
            if ((s[len-i]-'0')<0||(s[len-i]-'0')>9)
            {
                printf("\t\t\t你输入的第%d位不合法,按任意键重新输!!",len-i+1);
                getchar();
                goto aa;
            }
            else
                a[i]=s[len-i]-'0';
        }
        a[0]=len;
        break;
    }
    return;
}

void my_print(int *a) //输出时把数组倒过来就是答案
{
    int i;
    if (a[0]<0) printf("-");
    if (a[0]==0)
    {
        printf("0");
        return;
    }
    for(i=abs(a[0]);i>=1;i--)
        printf("%d",a[i]);
    printf("\n");
}

void format(int *a) //当两个字符相加时超过10时
{
    int p;
    for(p=1;p<a[0]||a[p]>=10;p++)
    {
        if (p>=a[0]) a[p+1]=0;
        a[p+1]+=a[p]/10;
        a[p]=a[p]%10;
    }
    if (p>=a[0]) a[0]=p;
    return;
}
void add(int *a,int *b,int *c) //加法的运算
{
    int len,i;
    if (a[0]<b[0]) len=a[0];
    else len=b[0];
    for(i=1;i<=len;i++)
        c[i]=a[i]+b[i];
    if (len<a[0])
    {
        for (;i<=a[0];i++)
            c[i]=a[i];
        c[0]=a[0];
    }
    else
    {
        for(;i<=b[0];i++)
        {
            c[i]=b[i];
        }
        c[0]=b[0];
    }
    format (c);
}



void format1(int *a) //减法 相减为负时
{
    int i;
    for (i=1;i<=a[0];i++)
        if (a[i]<0)
        {   
            a[i]+=10;
            a[i+1]-=1;
        }
}

void sub_1(int *a,int *b,int *c)  
{
    int i;
    for (i=1;i<=b[0];i++)
        c[i]=a[i]-b[i];
    if (a[0]==b[0]) goto loop;
    for (;i<=a[0];i++)
        c[i]=a[i];
loop:
    c[0]=a[0];
    format1(c);
    i=c[0];
    while(1)
        if (c[i]==0) i--;
        else break;
        c[0]=i;
        return;
}


void sub(int *a,int *b,int *c)
{
    int i,flag=0;
    for (i=1;i<=a[0];i++)
        if (a[i]!=b[i]) { flag=1; break; }
        if (flag==0) {
            c[0]=0;
            return;
        }
        flag=0;
        if (a[0]==b[0]) {
            i=a[0];
            while(i>0)
            {
                if (a[i]>b[i]){
                    sub_1(a,b,c);
                    break;
                }
                if (a[i]<b[i]){
                    flag=1;
                    sub_1(b,a,c);
                    break;
                }
                i--;
            }
        }
        if (a[0]>b[0])
            sub_1(a,b,c);
        else
            if (a[0]<b[0])
            {
                flag=1;
                sub_1(b,a,c);
            }
            if (flag)
                c[0]=-c[0];
            else
                c[0]=c[0];
}
void main()
{
    int a[MAX],b[MAX],c[MAX];
    char yn,eq;



strat:   printf("请输入表达式(操作数和操作符之间需空格):\n");
         my_read(a);
         scanf("%s",&yn);
         my_read(b);
         scanf("%s",&eq);
         if (yn=='+'&&eq=='=')
         {
             add(a,b,c);
             printf("\n\t\t\t");
             printf("A=");
             my_print(a);
             printf("\n\t\t\t");
             printf("B=");
             my_print(b);
             printf("\n\t\t\t");
             printf("C=A+B=");
             my_print(c);
             goto loop;
         }
         if (yn=='-'&&eq=='=')
         {
             sub(a,b,c);
             printf("A=");
             my_print(a);
             printf("\nB=");
             my_print(b);
             printf("\nC=A-B=");
             my_print(c);
             goto loop;
         }
         else{ printf("输入错误");
         goto loop;
         }
loop:
         while(1)
         {
             printf("\n\t\t\t继续计算吗?(y/n)");
             yn=getchar();
             if (yn=='y') goto strat;
             if (yn=='n') return;
         }
}   
这个输入的时候运算符左右需加空格(比如1 + 1 =),如果我不想加空格(1+1=),那要怎么办?谢谢啦
搜索更多相关主题的帖子: 大数 相加 
2007-12-17 21:51
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*#include <fstream.h>*/
#define MAX 400


void my_print(int *a) /* 输出时把数组倒过来就是答案 */
{
    int i;
    if (a[0]<0) printf("-");
    if (a[0]==0)
    {
        printf("0");
        return;
    }
    for(i=abs(a[0]);i>=1;i--)
        printf("%d",a[i]);
    printf("\n");
}

void format(int *a) /* 当两个字符相加时超过10时 */
{
    int p;
    for(p=1;p<a[0]||a[p]>=10;p++)
    {
        if (p>=a[0]) a[p+1]=0;
        a[p+1]+=a[p]/10;
        a[p]=a[p]%10;
    }
    if (p>=a[0]) a[0]=p;
    return;
}
void add(int *a,int *b,int *c) /* 加法的运算 */
{
    int len,i;
    if (a[0]<b[0]) len=a[0];
    else len=b[0];
    for(i=1;i<=len;i++)
        c[i]=a[i]+b[i];
    if (len<a[0])
    {
        for (;i<=a[0];i++)
            c[i]=a[i];
        c[0]=a[0];
    }
    else
    {
        for(;i<=b[0];i++)
        {
            c[i]=b[i];
        }
        c[0]=b[0];
    }
    format (c);
}



void format1(int *a) /* 减法 相减为负时 */
{
    int i;
    for (i=1;i<=a[0];i++)
        if (a[i]<0)
        {   
            a[i]+=10;
            a[i+1]-=1;
        }
}

void sub_1(int *a,int *b,int *c)  
{
    int i;
    for (i=1;i<=b[0];i++)
        c[i]=a[i]-b[i];
    if (a[0]==b[0]) goto loop;
    for (;i<=a[0];i++)
        c[i]=a[i];
loop:
    c[0]=a[0];
    format1(c);
    i=c[0];
    while(1)
        if (c[i]==0) i--;
        else break;
        c[0]=i;
        return;
}


void sub(int *a,int *b,int *c)
{
    int i,flag=0;
    for (i=1;i<=a[0];i++)
        if (a[i]!=b[i]) { flag=1; break; }
        if (flag==0) {
            c[0]=0;
            return;
        }
        flag=0;
        if (a[0]==b[0]) {
            i=a[0];
            while(i>0)
            {
                if (a[i]>b[i]){
                    sub_1(a,b,c);
                    break;
                }
                if (a[i]<b[i]){
                    flag=1;
                    sub_1(b,a,c);
                    break;
                }
                i--;
            }
        }
        if (a[0]>b[0])
            sub_1(a,b,c);
        else
            if (a[0]<b[0])
            {
                flag=1;
                sub_1(b,a,c);
            }
            if (flag)
                c[0]=-c[0];
            else
                c[0]=c[0];
}
int main()
{
    int a[MAX],b[MAX],c[MAX],i,j,len;
    char yn,eq,s[2*MAX];



start:   

        printf("请输入表达式:\n");
         scanf("%s",s);
         len=strlen(s);
         for(i=0;i<len;i++)
            if(s[i]=='+'||s[i]=='-')
                j=i;

        for(i=0;i<j;i++)
             a[i+1]=s[j-i-1]-'0';
        a[0]=j;
        
         for(i=0;i<len-j-2;i++)
             b[i+1]=s[len-i-2]-'0';
         b[0]=len-j-2;
        
         yn=s[j];
         eq=s[len-1];

         if (yn=='+'&&eq=='=')
         {
             add(a,b,c);
             printf("\n\t\t\t");
             printf("A=");
             my_print(a);
             printf("\n\t\t\t");
             printf("B=");
             my_print(b);
             printf("\n\t\t\t");
             printf("C=A+B=");
             my_print(c);
             goto loop;
         }
         if (yn=='-'&&eq=='=')
         {
             sub(a,b,c);
             printf("A=");
             my_print(a);
             printf("\nB=");
             my_print(b);
             printf("\nC=A-B=");
             my_print(c);
             goto loop;
         }
         else{ printf("输入错误");
         goto loop;
         }
loop:
         while(1)
         {
             printf("\n\t\t\t继续计算吗?(y/n)");
             yn=getchar();
             if (yn=='y') goto start;
             if (yn=='n') return;
         }
        return 0;
}
收到的鲜花
  • ls1205350212007-12-18 10:22 送鲜花  1朵   附言:此信息有用

丛丛芳芫满冬秋,淡淡一笑泯恩仇!
2007-12-18 09:07
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
对您的程序进行了简单的修改,基本上也算满足要求了。

丛丛芳芫满冬秋,淡淡一笑泯恩仇!
2007-12-18 09:08
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
收藏
得分:0 
#include <stdio.h>
int main()
{
    char a[100],b[100],c;
    int i=0,j=0,m,n,flag=0;
    while((c=getchar())!=' ')
    {
        a[i]=c;
        i++;
    }
    a[i]='\0';
    while((c=getchar())!='\n')
    {
        b[j]=c;
        j++;
    }
    b[j]='\0';
    i--;
    j--;
    if(i>=j)
    {
        for(;j>=0;j--)
        {
            m=a[i]-'0'+b[j]-'0'+flag;
            n=m%10;
            a[i]='0'+n;
            flag=m/10;
            i--;
        }
        for(;i>=0;i--)
        {
            if(!flag)
                break;
            m=a[i]-'0'+flag;
            n=m%10;
            a[i]='0'+n;
            flag=m/10;
        }
        if(flag)
            printf("%d",flag);
        puts(a);
    }
    else
    {
        for(;i>=0;i--)
        {
            m=a[i]-'0'+b[j]-'0'+flag;
            n=m%10;
            b[j]='0'+n;
            flag=m/10;
            j--;
        }
        for(;j>=0;j--)
        {
            if(!flag)
                break;
            m=b[j]-'0'+flag;
            n=m%10;
            b[j]='0'+n;
            flag=m/10;
        }
        if(flag)
            printf("%d",flag);
        puts(b);
    }
    getchar();
    return 0;
}
大数相加(不超过100位,需要更大的改点点就可以)if语句里两部分基本一样,可以用个函数写出来。这样程序更短点!
2007-12-18 09:40
ls120535021
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-8
收藏
得分:0 
谢谢两位了 ,唉,学了一个学期了竟然连这都不会,请问 有什么好的方法?
2007-12-18 10:20
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
不要急,慢慢来,多思考,多练习吧!

丛丛芳芫满冬秋,淡淡一笑泯恩仇!
2007-12-18 10:27
freeforever
Rank: 4
等 级:业余侠客
威 望:3
帖 子:368
专家分:201
注 册:2005-11-2
收藏
得分:0 
#include <iostream>
#include <vector>
#include <string>
using namespace std;

//把字串存入向量
vector<int> vecfromstring(string strnum)//把字串存入向量,个位在0元素中
{
    vector<int> num;//返回长整数用的向量
    char ch;
    for(int i=strnum.length()-1;i>=0;--i)
        //循环转换
        num.push_back(strnum[i]-'0');
    return num;//返回结果
}

void outvec(vector<int> vec)//输出长整数
{
    for(int i=vec.size()-1;i>=0;--i)
        cout<<vec[i];//存储方式是原数逆顺
}

//进位/借位调整
void checkvec(vector<int>& vec, bool blnadd)
{
    int len=vec.size();
    if(blnadd)//进位调整
    {
        for(int i=0;i<len;++i)
            if(vec[i]>9)
            {
                if(i!=len-1)vec[i+1]++;
                else  vec.push_back(1);
                vec[i]-=10;
            }
    }   
    else
    {
        for(int i=0;i<len;++i)
            if(vec[i]<0)
            {
                vec[i]+=10;
                if(i!=len-1)vec[i+1]--;
                else vec.push_back(-1);
            }
    }   
}

//长整数相加函数,返回结果向量,参数和返回值的个位在元素0 +++
vector<int> add(vector<int> x,vector<int> y,bool blndot)
{
    int lenx=x.size();//向量长度
    int leny=y.size();
    vector<int> min;//加数
    min=lenx<leny?x:y;//以短的为加数,节省时间
    vector<int> res(lenx>=leny?x:y);//被加数
   
    if(!blndot&&x.empty()&&y.empty()){res.push_back(0);return res;}
   
    for(int i=0;i<min.size();++i)
        res[i]+=min[i];//相加
    checkvec(res,true);//调整进位
    return res;
}   

//拆分浮点串为整数串和小数串
//               浮点串,    整数串,        小数串,        ,小数点位置
void splitstring(string str,string& strint,string& strdot,int idot)
{
     int len=str.length();
     strint=str.substr(0,idot);
     strdot=str.substr(idot+1,len-idot-1);
}

void formatdotstring(string& str,int len)
{
     for(int i=0;i<len;++i)str.push_back('0');
}

string stringfromvec(vector<int> ivec)
{
    string strresult="";
    for(int i=ivec.size()-1;i>=0;--i)
        strresult.push_back(ivec[i]+'0');
    return strresult;
}

//比较两个字串数值的大小比较(返回:1大于,0等于,-1小于)
int comparevec(vector<int> ivec1,vector<int> ivec2)
{
    int len1=0,len2=0;
    len1=ivec1.size(),len2=ivec2.size();
    if(len1>len2) return 1;
    else if(len1<len2) return -1;
    else
    {
        for(int i=len1-1;i>=0;--i)
        {
            if(ivec1[i]>ivec2[i])return 1;
            else if(ivec1[i]<ivec2[i])return -1;
        }
        return 0;
    }
}

vector<int> sub(vector<int> ivec1,vector<int> ivec2,bool blnint)
{
    vector<int> ivecres,ivectmp;
    int len1=ivec1.size(),len2=ivec2.size(),itmp;
    bool blnlowzero=false;
   
    //测试完全相等时返回0
    if(comparevec(ivec1,ivec2)==0){ivecres.push_back(0);return ivecres;}
   
    itmp=len1<len2?len1:len2;
    ivecres=ivec1;//被减数为整数中的长的,小数中的前者
    for(int i=0;i<itmp;++i)ivecres[i]-=ivec2[i];//减运算
    checkvec(ivecres,false);//调整进位
    return ivecres;
}

string adddouble(string str1,string str2)
{
    //         整数向量1,整数向量2,小数向量1,小数向量2,小数向量和,整数向量和
    vector<int> ivecint1,ivecint2, ivecdot1, ivecdot2,ivecdotadd, ivecintadd,ivectmp;
    //     整数1,  整数2,  小数1,  小数2
    string strint1,strint2,strdot1,strdot2,strintadd,strdotadd,strsubflag,strdot;
    //   串1小于0,         串2小于0,         结果小于0
    bool blnlowzero1=false,blnlowzero2=false,blnlowzero=false;
    bool blnvec1lowzero=false, blnvec2lowzero=false;
    //  串1长, 串2长, 串1小数位置,串2小数位置,串1小数长, 串2小数长,小数和的长, 最长小数长度
    int len1=0,len2=0,idot1=0,     idot2=0,    lendot1=0,lendot2=0,lendotadd=0,lendotmax=0;
   
    //去掉负号并设置标志位
    if(str1[0]=='-'){str1.erase(0,1);blnvec1lowzero=true;}
    if(str2[0]=='-'){str2.erase(0,1);blnvec2lowzero=true;}
    //无小数但末尾有小数点时补个"0"
    if(str1.find('.')==str1.length()-1)str1+='0';
    if(str2.find('.')==str2.length()-1)str2+='0';
    //验证或设置小数点(无小数点加 ".0")
    if((idot1=str1.find('.'))==-1)
    {str1.push_back('.');str1.push_back('0');idot1=str1.find('.');}
    if((idot2=str2.find('.'))==-1)
    {str2.push_back('.');str2.push_back('0');idot2=str2.find('.');}
   
    //分割出整数和小数
    splitstring(str1,strint1,strdot1,idot1);
    splitstring(str2,strint2,strdot2,idot2);
    lendot1=strdot1.size();lendot2=strdot2.size();
    //格式化小数
    lendotmax=lendot1>lendot2?lendot1:lendot2;//最长小数长度
    //把短小数和长小数对齐(短的后面补0)
    if(lendot1<lendot2)formatdotstring(strdot1,lendot2-lendot1);//格式花小数
    else               formatdotstring(strdot2,lendot1-lendot2);
    //转换整数,小数为向量
    ivecdot1=vecfromstring(strdot1);
    ivecdot2=vecfromstring(strdot2);
    ivecint1=vecfromstring(strint1);
    ivecint2=vecfromstring(strint2);
   
    //小数串1,2的长度
    lendot1=strdot1.length();
    lendot2=strdot2.length();
   
    if(blnvec1lowzero==blnvec2lowzero)//同号
    {
        lendotmax=lendot1>lendot2?lendot1:lendot2;
        ivecdotadd=add(ivecdot1,ivecdot2,false);//小数相加
        int iresdotheight=ivecdotadd.size()-1;//小数最高位
        if(lendotmax<ivecdotadd.size())//小数最高位有向整数的进位
        {
            ivecdotadd.pop_back();;//进位后
            ++ivecint1[0];//向整数进位
        }
        ivecintadd=add(ivecint1,ivecint2,true);//整数相加(已经包含小数进位)
        strsubflag=blnvec1lowzero?"-":"";//同号为负时输出有负号        
    }else//符号不同( A:-1+2=2-1 B:2+(-1)=2-1 C:-2+1=1-2* D:1+(-2)=-(2-1)* )
    {
        int icmp=comparevec(ivecint1,ivecint2);
        if(icmp==-1)//小减大:D
        {//交换
            ivectmp=ivecdot1;ivecdot1=ivecdot2;ivecdot2=ivectmp;
            ivectmp=ivecint1;ivecint1=ivecint2;ivecint2=ivectmp;
        }   
        if(comparevec(ivecdot1,ivecdot2)==-1)//需要向整数借位
        {
            ivecdot1[ivecdot1.size()-1]+=10;
            ivecint1[0]--;
        }
        
        ivecdotadd=sub(ivecdot1,ivecdot2,false);//小数减
        ivecintadd=sub(ivecint1,ivecint2,true);//整数减
        if(icmp==-1&&blnvec2lowzero||icmp==1&&blnvec1lowzero)strsubflag="-";
    }
    strintadd=stringfromvec(ivecintadd);//换成串
    while(strintadd[0]=='0')strintadd.erase(0,1);//去掉整数前置0
    strdotadd=stringfromvec(ivecdotadd);//换成串
    while(strdotadd[strdotadd.length()-1]=='0')//去掉小数后置 0
        strdotadd.erase(strdotadd.length()-1,1);
    strdot=!strdotadd.empty()?".":"";//无小数时不输出小数点
    if(strintadd.empty())strintadd="0";
    return strsubflag+strintadd+strdot+strdotadd;
}

int main()
{
    string str1, str2,stradd;
    while(true)
    {
        cin>>str1;cin>>str2; //输入两个浮点数
        stradd=adddouble(str1,str2);
        cout<<stradd<<endl<<endl;
        cin.get();cin.get();
    }   
}

以前写的一个程序,整数和小数分开处理的.
能改进,把小数和整数对阶,统一小数长度,相加,输出就行了,能少一次相加运算
收到的鲜花
  • ls1205350212007-12-19 12:00 送鲜花  1朵   附言:精品文章

其实我也很无聊!
2007-12-18 13:19
快速回复:两个大数相加
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040322 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved