| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2672 人关注过本帖, 1 人收藏
标题:自己写了一个大数加法,请各位个点意见
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏(1)
已结贴  问题点数:20 回复次数:16 
自己写了一个大数加法,请各位个点意见
#include <iostream>
using namespace std;

int a[1000],b[1000],result[1000];
int main()
{
    int t,i=1;
    while(cin>>t)
        a[i++]=t;

    cin.clear();
    cin.sync();
   
    int j=1;
    while(cin>>t)
        b[j++]=t;
   
    int k,flag;
    if(i>j)
    {
        for(flag=k=i-1;k>=0;--k)
            result[k]=a[k]+(k>=j?b[k]:0);
    }
    else if(i<j)
    {
        for(flag=k=j-1;k>=0;--k)
            result[k]=b[k]+(k>=i?a[k]:0);
    }
    else
    {
        for(flag=k=j-1;k>=0;--k)
            result[k]=b[k]+a[k];
    }
   
    for(int s=flag;s>=1;--s)
    {
        if(result[s]>9)
        {
            int t=result[s]%10;
            if(s-1)
                result[s-1]+=result[s]/10;
            else
                result[s-1]=result[s]/10;
            result[s]=t;
        }
    }
   
    for(int s=0;s<=flag;++s)
        cout<<result[s];
    cout<<endl;
    return 0;
}
搜索更多相关主题的帖子: int result cin flag for 
2018-05-30 12:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
这个可以,简单清晰容易理解,当然我只是看了宏观,思路没有问题,至于细节有没有bug我就没有细看了,能正常得出结果就好~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-30 12:57
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 九转星河
我刚调了有点bug
2018-05-30 13:28
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
看我24行代码解决的大数加法:
程序代码:
#include <stdio.h>
void main()
{
    char a[1001],b[1001],c[1002];
    int i,j,k,l;
    while(scanf("%s%s",a,b))
    {
        for(i=0;a[i];i++);
        for(j=0;b[j];j++);                              //把指针调整到加数、被加数最后一位,从个位数开始加
        for(k=c[1001]=0,l=1000;i||j||k;l--)             //把相加结果从c[1000]--c[0]存储
        {
            c[l]=(i?a[i-1]:'0')+(j?b[j-1]:'0')+k-'0';   //做加法:A+b+进位
            k=0;
            if(c[l]>'9')
            {
                k=1;
                c[l]-=10;                               //处理进位
            }
            if(i)i--;
            if(j)j--;
        }
        printf("%s\n",&c[l+1]);
    }
}

能编个毛线衣吗?
2018-05-30 15:55
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:4 
回复 4楼 wmf2014
厉害
2018-05-30 16:13
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
#include <iostream>
using namespace std;

int a[1000],b[1000],result[1000];
int main()
{
    int t,i=1;
    while(cin>>t)
        a[i++]=t;

    cin.clear();
    cin.sync();
   
    int j=1;
    while(cin>>t)
        b[j++]=t;
   
    int k,flag;
    if(i>j)
    {
        int len=i-j;
        for(flag=k=i-1;k>=0;--k)
            result[k]=a[k]+b[k-len];

    }
    else if(i<j)
    {
        int len=j-i;
        for(flag=k=j-1;k>=0;--k)
            result[k]=b[k]+a[k-len];

    }
    else
    {
        for(flag=k=j-1;k>=0;--k)
            result[k]=b[k]+a[k];
    }
   
    for(int s=flag;s>=1;--s)
    {
        if(result[s]>9)
        {
            int t=result[s]%10;
            if(s-1)
                result[s-1]+=result[s]/10;
            else
                result[s-1]=result[s]/10;
            result[s]=t;
        }
    }
   
    for(int s=0;s<=flag;++s)
        cout<<result[s];
    cout<<endl;
    return 0;
}
在原来的代码上做了改动(红色标记)
2018-05-30 17:48
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:4 
以下是引用wmf2014在2018-5-30 15:55:09的发言:

看我24行代码解决的大数加法:
#include <stdio.h>
void main()
{
    char a[1001],b[1001],c[1002];
    int i,j,k,l;
    while(scanf("%s%s",a,b))
    {
        for(i=0;a;i++);
        for(j=0;b[j];j++);                              //把指针调整到加数、被加数最后一位,从个位数开始加
        for(k=c[1001]=0,l=1000;i||j||k;l--)             //把相加结果从c[1000]--c[0]存储
        {
            c[l]=(i?a1]:'0')+(j?b[j-1]:'0')+k-'0';   //做加法:A+b+进位
            k=0;
            if(c[l]>'9')
            {
                k=1;
                c[l]-=10;                               //处理进位
            }
            if(i)i--;
            if(j)j--;
        }
        printf("%s\n",&c[l+1]);
    }
}

--i和--j的操作摆在c[l]赋值里面
能再少2行

https://zh.
2018-05-30 18:08
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 7楼 lin5161678
估计你是说通过“c[l]=(i?a[--i]:'0')+(j?b[--j]:'0')+k-'0';   //做加法:A+b+进位”的方式减少两行代码。实际上这是不规范的,可能产生系列点问题,在不同编译器上得到不同结果。

看到楼主又发了大数乘法,忍不住也写了个,现在把大数加法和乘法都变成函数调用的方式了,代码如下:
程序代码:
#include <stdio.h>

int largadd(char *,char *,char *,int);
int largmult(char *,char *,char *,int);

void main()
{
    char a[1001],b[1001],c[2002];
    while(scanf("%s%s",a,b))
    {
        printf("%s\n",c+largadd(a,b,c,2002));
        printf("%s\n",c+largmult(a,b,c,2002));
    }
}
int largadd(char *a,char *b,char *c,int len)
{//大数加法,a:被加数 b:加数 c:相加结果 len:数组c的长度
    int i,j,k,l=len-1;
    for(i=0;a[i];i++);
    for(j=0;b[j];j++);                              //把指针调整到加数、被加数最后一位,从个位数开始加
    for(k=c[l]=0,l--;i||j||k;l--)                   //把相加结果从c[l-2]--c[0]存储
    {
        c[l]=(i?a[i-1]:'0')+(j?b[j-1]:'0')+k-'0';   //做加法:A+b+进位
        k=0;
        if(c[l]>'9')
        {
            k=1;
            c[l]-=10;                               //处理进位
        }
        if(i)i--;
        if(j)j--;
    }
    //可在这里加消前导0的代码,否则000009+1=000010
    return l+1;
}

int largmult(char *a,char *b,char *c,int len)
{//大数乘法,a:被乘数 b:乘数 c:相乘结果 len:数组c的长度
    int i,j,k,l,m,n;
    for(m=0;a[m];m++);
    for(n=0;b[n];n++);                              //把指针调整到乘数、被乘数最后一位,从个位数开始相乘
    for(i=0;i<len;i++)c[i]=0;                       //运算结果先清零
    for(i=n;i;i--)
    {
        l=len+i-n-2;
        for(k=0,j=m;j;j--)
        {//按位做乘法
            c[l]=(a[j-1]-'0')*(b[i-1]-'0')+k+c[l];
            k=c[l]/10;
            c[l]=c[l]%10;
            l--;
        }
        c[l]+=k;                                    //按位乘法补进位
    }
    if(k)c[l--]=k;                                  //最终结果补进位
    for(i=l+1;i<len-1;i++)
    {
        c[i]+='0';       
        if(c[i]=='0')l++;                           //调整数字为字符串同时消前导0
    }
    if(!c[l+1])l--;                                 //如果字符串长度为0,至少显示一个0,如999999999999*0结果不会消所有前导0
    return l+1;
}

能编个毛线衣吗?
2018-05-31 14:43
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用wmf2014在2018-5-31 14:43:35的发言:

估计你是说通过“c[l]=(i?a[--i]:'0')+(j?b[--j]:'0')+k-'0';   //做加法:A+b+进位”的方式减少两行代码。实际上这是不规范的,可能产生系列点问题,在不同编译器上得到不同结果。


那是不可能的
不管什么编译器结果都一样
因为这个不是未定义行为
要满足UB 得在两个序列点中间 出现多次读写同一个变量的操作
这里?: 自带序列点 不会导致在两个序列点中间多次读写同一个变量
没有问题

https://zh.
2018-05-31 15:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
--i只能在一个序列点用一次,这里没有问题,当然i--在同一个序列点用多少次都没问题了,个人感觉i--比--i对表达式的影响要小一点~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-31 15:46
快速回复:自己写了一个大数加法,请各位个点意见
数据加载中...
 
   



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

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