码迷,mamicode.com
首页 > 其他好文 > 详细

大整数运算

时间:2016-08-04 11:37:52      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:

大数相加运算

输入:a ,b两个整数

输出:a+b(结果最大可达1000位数字,123为3位数)

Sample Input:

122333444455555666666777777788888888999999999

985211

Sample Output:

122333444455555666666777777788888889000985210

 

这道题就是典型的大数相加运算

思路:我们可以先把数字存在字符串数组里,然后再转存到整型数组里,最后相加即可。

我们在数字位数小的那个数的前面补0,补到位数与另一个位数相同。那如何补0 ?其实很简单,一开始将设的两个整型数组初始化为0就好了。(int nn1[1000]={0},nn2[1000]={0};)

然后再将位数小的数字放在放在最后面。例如第一个数是45位,第二个数是6位,那么将第二个数从第40位开始存放,即从nn2[40]开始;最后所有的数字每位相加,大于10进1就好了

122333444455555666666777777788888888999999999     45位数    

985211                             6位数

000000000000000000000000000000000000000985211

 

代码如下:

 

技术分享
#include<cstdio>
#include<cstring>
#define maxn 1001
char num1[maxn],num2[maxn];
int nn1[maxn] = {0};
int nn2[maxn] = {0};
int main(void)
{
    int i,len1,len2,max_len,mm;
    gets(num1);//先将数字存储在字符串数组中
    gets(num2);
    len1 = strlen(num1);
    len2 = strlen(num2);
    mm = max_len = len1 > len2 ? len1 : len2;//max_len为两个数字中最大的数字的位数
    //将两个字符串分别转换成整型数组,下面的i只是用来控制循环次数不是下标,我们从max_len下标开始存,一直到下标1,注意不是到0
    for(i = 0; i < len1; i++,mm--)
        nn1[mm] = num1[len1-i-1]-0;
    mm = max_len;
    for(i = 0; i < len2; i++,mm--)
        nn2[mm] = num2[len2-i-1]-0;
    //倒过来开始相加
    for(i = max_len; i >= 0; i--)
    {
        nn1[i] += nn2[i];
        if(nn1[i] >= 10)//大于10,要进1
        {
            nn1[i] %= 10;//这里也可写 nn1[i] = nn1[i]-10;
            nn1[i-1]++; //表示进1
        }
    }
    //之前a[0]是用来存放进位数的,所以转换数字的时候没有使用
    if(nn1[0])  //a[0]不等于0,说明有进位,则从a[0]开始打印,否则从a[1]开始
        for(i = 0; i <= max_len; i++)
            printf("%d",nn1[i]);
    else
        for(i = 1; i <= max_len; i++)
            printf("%d",nn1[i]);

    return 0;
}
View Code

 

大整数运算

标签:

原文地址:http://www.cnblogs.com/Muia/p/5736024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!