C语言超大数相加

来源:互联网 发布:java swing 输入框 编辑:程序博客网 时间:2024/06/11 21:34


超大数相加

这里超大数表示已经超出int、long、long long 范围的数字,所以不能简单的相加。此时就要用字符串,把输入的内容储存在字符串中,通过字符与数字之间的关系计算结果。

思路:

1.输入xxxx+xxxxxx,已‘+’分割成两个子串。

2.逆序两个子串,末位变成首位对齐,按位相加,大于10则向后位进一。

3.需要考虑到两个数长度不同的情况。

4.再把最后的结果逆序输出,就得到了最终正向相加的结果


代码如下:

#include <stdio.h>#include <string.h>void reverse(char *s,int len);char * addLargeNumber(char *s1,char *s2);int main(int argc, char const *argv[]){char str[100];int len[10];//截取的每个子串的长度scanf("%s",str);char *sep = "+-*/";char *p = strtok(str,sep);char *s = p;char *k = p;len[0] = strlen(p);reverse(p, len[0]);puts(p);while(1){ s = strtok(NULL, sep); if (s == NULL) { break; } len[1] = strlen(s); reverse(s,len[1]); puts(s); k = s;//}printf("access to addLargeNumber\n");p = addLargeNumber(p,k);len[2] = strlen(p);reverse(p,len[2]);puts(p);return 0;}//反转一个字符串void reverse(char *s,int len){char temp; int i; for(i = 0;i<len/2;i++) { temp = s[i]; s[i] = s[len-1-i]; s[len-1-i] = temp; } }//接收两个字符串,把长度小的加到长度大的串上,返回相加后的串char * addLargeNumber(char *s1,char *s2){char *p = s1;char *q = s2;char k;int i;printf("子串1的长度=%lu 子串2的长度=%lu\n", strlen(p),strlen(q));int len = strlen(q);//确保p指向长度较长的串。确保len的值为较小的串的长度。 if (strlen(s1)<strlen(s2)){len = strlen(p);q = s2;p = s1;}int difflen = strlen(p)-strlen(q);//两个子串长度的差值。//printf("len = %d difflen = %d\n",len ,difflen);for (i = 0; i <len; ++i){int a = p[i] + q[i] -96;//printf("a = %d\n", a);if (a>=10){k = a -10+ 48;p[i+1] += 1;}else {k = a + 48;}//printf("k = %c\n", k);p[i] = k;printf("p[%d] = %c\n", i,p[i]);}//解决较长串后一位如果被进位的情况。例如:1379+128(假设两个已逆序的串)或者15999+148for(i = 0;i<difflen;i++){if (p[len+i] == 58){p[len+i] -= 10;if (i == difflen-1){//当i指向最后一个有效数字时,并且当前位是‘:’,则将其后一位赋为结束符p[len+i+1] = 49;//这种是赋值符号,是将'1'赋给p[i]。对比下面的运算符p[len+difflen+1] = 0;}else{p[len+i+1] += 1;//这种是运算符,是将p[i]的ASCII码加1.}printf("p[%d] = %c\n",len+i,p[len+i] );}else{break;}}printf("相加之后的串长度= %lu\n", strlen(p));puts(p);return p;}


0 0