C语言超大数相加


超大数相加

这里超大数表示已经超出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+148
	for(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;
}


你可能感兴趣的:(c,字符串,C语言,大数相加)