博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 1002:C++ 千位数以内的大数加法
阅读量:5746 次
发布时间:2019-06-18

本文共 2322 字,大约阅读时间需要 7 分钟。

hot3.png

编译环境:MinGW5.1.6

1.大数加法函数实现思路

1)函数输入:字符串形式的数字a和b

2)翻转字符串a和b,这样可以使两个数字的末位对其,利于逐位加法运算

3)将a和b中各位相加,和赋值到字符串sum对应位中,如果有进位则sum中的下一位自增1

4)将字符串a、b、sum翻转,a和b会翻转为它们原来的样子,sum即数字a与b的和

5)去掉sum前面多余的0

6)函数输出:字符串形式的数字sum

2.函数体(包括翻转字符串用的函数Reverse和加法函数Add)

///翻转一个字符串/* *@param char s[] 被翻转的字符串 *@return char* 翻转后的字符串 */char* Reverse(char s[]){    int i = 0, j = strlen(s) - 1;    char temp;    while(i < strlen(s) / 2)    {        temp = s[i];        s[i] = s[j];        s[j] = temp;        i++;        j--;    }    return s;}///两个字符串表示的大数的加法运算/* *@param char a[] 加数1 *@param char b[] 加数2 *@return char* 和 */char* Add(char a[], char b[]){    int i, j;    char* sum = new char[1001];    //翻转数组a和b    Reverse(a);    Reverse(b);    //两数组共有的位    sum[0] = '0';    for(i = 0; i < strlen(a) && i < strlen(b); i++)    {        sum[i + 1] = '0';        sum[i + 2] = 0;        sum[i] += (a[i] - '0') + (b[i] - '0');        if(sum[i] > '9')        {            sum[i] -= 10;            sum[i + 1] ++;        }    }    //如果a的位数比b多,考虑a的高位    if(strlen(a) > strlen(b))    {        for(i = strlen(b); i < strlen(a); i++)        {            sum[i + 1] = '0';            sum[i + 2] = 0;            sum[i] += (a[i] - '0');            if(sum[i] > '9')            {                sum[i] -= 10;                sum[i + 1] ++;            }        }    }    //如果b的位数比a多,考虑b的高位    else if(strlen(b) > strlen(a))    {        for(i = strlen(a); i < strlen(b); i++)        {            sum[i + 1] = '0';            sum[i + 2] = 0;            sum[i] += (b[i] - '0');            if(sum[i] > '9')            {                sum[i] -= 10;                sum[i + 1] ++;            }        }    }    //翻转数组sum    Reverse(sum);        //复原数组a和b    Reverse(a);    Reverse(b);        //去掉前面多余的0    while(*sum == '0')    {        sum += 1;    }    return sum;}

3.函数调用

输入迭代次数times。输入两个数a和b,程序返回a与b的和,迭代times次。

int main(){    char a[1000], b[1000];    //指定循环次数    int counter, times;    cin >> times;    for(counter = 1; counter <= times; counter ++)    {        //输入两个数字并求和        cin >> a >> b;                cout << "Case " << counter << ':' << endl;        cout << a << " + " << b << " = " << Add(a, b) << endl;                if(counter != times)        {            cout << endl;        }    }    return 0;}

4.运行结果

195603_bUrH_1425762.png

END

转载于:https://my.oschina.net/Tsybius2014/blog/299400

你可能感兴趣的文章
阿里云MVP Meetup 《云数据·大计算:海量日志数据分析与应用》之《数据质量监控》篇...
查看>>
3D生物打印药物,给人类带来了更可靠、更有效的药物治疗方式
查看>>
ActiveMQ 即时通讯服务 浅析
查看>>
Setting styles on individual Flex Accordion headers
查看>>
10【在线日志分析】之基于Spark Streaming开发OnLineLogAanlysis1
查看>>
SQL语句技巧之去除重复行
查看>>
关于MFC的多线程类 CSemaphore,CMutex,CCriticalSection,CEvent
查看>>
“逆向思维”让你看得更远(转)
查看>>
linkedserver 的使用
查看>>
PB生成exe文件
查看>>
postgresql 定时收集表和索引统计信息
查看>>
taobao npm registry
查看>>
Co、递归调用引发的内存泄漏
查看>>
交换两个数字,不借助于第三个变量的三种简单的方法。
查看>>
云创“cStor云存储系统软件V2.0”获评2017年江苏省优秀版权作品二等奖
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
怕死吗?研究人员推出可模拟“灵魂出窍”的VR系统
查看>>
音视频参数解析
查看>>
2017全球互联网经济大会在京开幕
查看>>
GlusterFS 3.7.1安装手记
查看>>