运行环境: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]="9t5h724";

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*)函数将字符串中的非数字字符去掉。当然此算法肯定还可以优化,不过小白的我目前就先记录到这里,希望大家有什么好的方法能告诉我,我一定会虚心尝试的。