码迷,mamicode.com
首页 > 编程语言 > 详细

日常记录(c语言)--字符串实现大整数加法

时间:2016-08-08 19:42:05      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:字符串   大整数加法   

 运行环境:CentOs 64位--vim 

 最近在看《剑指offer》这本书,看了前面的关于面试的能力,顿时觉得自己的编程能力差得好远。

可能我对鲁棒的代码理解还不深,我觉得鲁棒应该就是代码可以应对各种不同的输入,都能有相应的处理,并给出相应的输出。

  下面是我看了之后对之前做过的大整数加法做了一些完善,之前的只能实现对纯数字字符进行求和,甚至连对空指针的处理都没有,好惭愧。我会用注释来记录自己对此算法的理解。

  1 #include <stdio.h>

  2 #include <string.h>

  3 int Sum(char *a,char *b,char *sum);//求和

  4 void Inverse(char *s);//将字符串逆置,以便求和

  5 

  6 int Change(char *r)    //去掉字符串中的非数字字符

  7 {

  8     int i = 0,j;

  9     if(r == NULL)

 10     {   printf("r is NULL!\n");

 11         return -1;

 12     }

 13     while(i < strlen(r))

 14     {

 15         if(r[i] <= ‘9‘ && r[i] >= ‘0‘)

 16             i++;

 17         else

 18             for(j = i;j < strlen(r);j++)

 19                 r[j] = r[j+1];

 20     }

 21     printf("Change = %s\n", r);

 22 }

 23 

 24 int Sum(char* a,char* b,char* sum)

 25 {

 26     if(a == NULL || b == NULL){

 27         printf("a or b is NULL!\n");

 28         return -1;

 29     }

 30     int m=strlen(a);

 31     int n=strlen(b);

 32     printf("m = %d,n = %d\n",m,n);

 33     int acc = 0;

 34     int t,i;

 35     Inverse(a);

 36     Inverse(b);

 37     printf("a = %s,b = %s\n",a,b);

 38     for(i = 0;i < m || i < n;i++)

 39     {

 40         if(i >= m)             //我之前并不知道这里为何要减‘0‘,后来

 41             t = b[i] - ‘0‘ + acc;    //查了ASCII码才知道。字符串运算的是

 42         else if(i >= n)          //ASCII码中字符对应的值,这是我通过

 43             t = a[i] - ‘0‘+ acc;    //GDB调试后知道的。数字字符减‘0‘后就

 44         else                //相当于字符变为整型可以和整型运算,

 45             t = a[i] - ‘0‘+ b[i] - ‘0‘ + acc;//加‘0‘又把数字变为字符。

 46         sum[i] = t % 10 + ‘0‘;

 47         if(t > 9)

 48             acc = 1;

 49         else

 50             acc = 0;

 51     }

 52     if(acc == 1)

 53         sum[i++] = ‘1‘;

 54     sum[i]=‘\0‘;

 55     Inverse(sum);

 56 }

 57 

 58 void Inverse(char *s)

 59 {

 60     int i;

 61     int length;

 62     char t;

 63     length=strlen(s);

 64     for(i=0;i<length-i-1;i++)

 65     {

 66         t=s[i];

 67         s[i]=s[length-i-1];

 68         s[length-i-1]=t;

 69     }

 70 }

 71 

 72 int main()

 73 {

 74     char a[100]="94jg987";

 75     char b[100]="9t5h624";

 76     char sum[100];

 77     printf("a=%s,b=%s\n",a,b);

 78     Change(a);

 79     Change(b);

 80     Sum(a,b,sum);

 81     printf("sum=%s\n",sum);

 82     return 0;

 83 }

    总结:算法思路就是先将字符串逆置,便于后面求和,为了防止字符串会出现非数字字符,可以先调用Change(char*)函数将字符串中的非数字字符去掉。当然此算法肯定还可以优化,不过小白的我目前就先记录到这里,希望大家有什么好的方法能告诉我,我一定会虚心尝试的。

日常记录(c语言)--字符串实现大整数加法

标签:字符串   大整数加法   

原文地址:http://11943991.blog.51cto.com/11933991/1835712

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