【笔试题】大整数相加

本机环境:64位Centos 7.4,vim、gcc编译工具。

假设用户输入的数据保存在数组adda,addb中,如果手工计算,就是从低位到高位依次先加,满十进一,那么有两个问题需要解决。

  • 问题:

1、用数组保存结果,那么结果的长度是多少位?

两个数相加,结果最大也只能比较大的那个数多一位。

lensum = lena > lenb ? lena : lenb;
lensum++;     //确定结果数组的长度lensum

2、怎么设计满十进一的算法?

如果没加一位,就对这一位判断是否需要进位,这样问题就会变复杂,可以先保存每一位相加的结果,然后对最终的结果数组进行处理。

两个数,adda = 1234567, addb = 678;

数组adda 1 2 3 4 5 6 7
数组addb 6 7 8
数组result 1 2 3 4 11 13 15

然后一次性对 result 数组进行处理。

for(i = lensun - 1; i > 0; i --)
{
  if(result[i] > 9)
  {
    result[i] = result[i] % 10;
    result[i-1] += 1;
    }
 }

实际上需要注意的是,数组首位下标为0,就是说 7+8 的结果会存在 result [ 0 ] 中,上面的表格是为了便于理解。

编码实现

char* bigadd(char *adda, int lena, char *addb, int lenb)
{     //加法运算的方法。
    int num = '0', i, k, j, tmp;
    for (i = 0; i<lena; i++)
    {                                      //将字符编码的数字转换为对应的数,
        adda[i] = adda[i] - num;                                  //例如6实际在字符串中存储的是54,
    }                                                         //减去0对应的48得到真实的6存储在字符数组中。
    for (i = 0; i<lenb; i++)
    {
        addb[i] = addb[i] - num;
    }

    int lensum;                      //求出结果数组的长度。
    lensum = lena>lenb ? lena : lenb;
    lensum++;

    char *result, final[BUFSIZ];                //result用于返回结果集,final数组用于整理结果集。
    result = (char*)calloc(lensum, 1);
    for (i = 0, j = 0; i<lena&&j<lenb; i++, j++)  //循环的给每一位作加法
    {                  
        result[i] = adda[lena - i - 1] + addb[lenb - i - 1];
    }
    if (lena>lenb)
    {                                          //使用判断将较大数的高位也写入结果数组
        for (i = lenb; i<lena; i++)
        {
            result[i] = adda[lena - i - 1];
        }
    }
    if (lenb>lena){
        for (i = lena; i<lenb; i++)
        {
            result[i] = addb[lenb - i - 1];
        }
    }
    for (k = 0; k<lensum - 1; k++)
    {                                //整理结果数组的每一位,满10进一。
        if (result[k]>9){
            tmp = result[k] / 10;
            result[k] = result[k] % 10;
            result[k + 1] += tmp;
        }
    }

    j = 0;
    if (result[lensum - 1] != 0)
    {                                 //去掉前前导0将结果处理后写到final数组中。
        final[j] = result[lensum - 1] + '0';
        j++;
    }
    for (i = lensum - 2; i >= 0; i--)
    {
        final[j++] = result[i] + '0';
    }
    result = final;                                            //再把result指针指向final数组中,并返回result指针。    
    return result;
}
发布了150 篇原创文章 · 获赞 280 · 访问量 32万+
展开阅读全文

Digital Roots 题目大意将输入的正整数的各个数相加

09-23

题目如下 The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit. For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39. 输入 The input file will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero. 输出 For each integer in the input, output its digital root on a separate line of the output. 样例输入 24 39 0 样例输出 6 3 我的思路是 1.将sum各位数字加起来,赋值sum 2.判断sum是否是个位数,如果不是,转1 3是个位数,输出结果,运算结束 sum%9的结果和整个数模9的结果相同,用来运算各个书之和。以下是我的代码。思路看起来没问题,但是运行结果和想象的不一样。 ``` #include <stdio.h> int main() { char ch; while(1){ //计算各位数字的和 int sum; while(scanf("%c",&ch) && ch!='\n'){ sum+=ch-'0'; } if (sum==0) break; //模9运算求根 if(sum%9==0) sum=9; else sum=sum%9; printf("%d\n",sum); } return 0; } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览