您的位置:首页 > 编程语言 > C语言/C++

C语言两个超大很大的数相加可以是浮点数,整数

2016-04-13 16:41 253 查看
      近期需要处理很大的数相加,数据的有效位超过16位,而double为最多是16位有效位,且目前的系统中已经没有更大的数据类型来存储超过16位的数据。所以自己写了一个可以处理超大数相加的函数。下面来给大家共享成果,希望可以帮助大家快速开发,节省时间。函数的总体思想就是把字符串转换成数字数组,然后按位进行数值运算。如果是浮点数即存在小数点,则先忽略小数点,把小数点和整数部分和并,正常数值运算,最后再加上小数点。输入相加的数可以是整数,也可以是浮点数,函数会根据输入计算精度。注意:函数目前只支持具有相同精度的数字相加,如有特殊需求,下面代码仅供参考学习,如果有疑问请留言。

/************函数说明***************/
函 数 名:add
功能描述:超大数据相加处理
入口参数:
s1 --加数1
s1 --加数2
出口参数:
add_ret --和结果
返回说明:
返回0 --成功
返回-1 --失败
开发人员:董dong
开发日期:20160413
/**************************************/
int add(char *s1,char *s2,char *add_ret)
{
int len1,len2,biglen,tempbiglen,i;
int a
={0},b
={0};
char temp_conv[2] = {0};
char *ppos = NULL;
int iprecision,temp1,temp2;

len1 = strlen(s1);
len2 = strlen(s2);
printf("len1 = %d\n",len1);
printf("len2 = %d\n",len2);

ppos = strchr(s1,'.');
if (ppos == NULL)
{
temp1 = 0;
}
else
{
temp1 = len1-(ppos - s1) - 1;
}
ppos = strchr(s2,'.');
if (ppos == NULL)
{
temp2 = 0;
}
else
{
temp2 = len2-(ppos - s2) - 1;
}
if (temp1 == temp2)
{
iprecision = temp1;
}
else
{
printf("The two data don't have same precision! Don't support!\n");
return -1;
}
printf("iprecision = %d\n",iprecision);
if(len1 < len2)
biglen = len2;
else
biglen = len1;
tempbiglen = biglen;
if (iprecision != 0)
biglen -= 1;
for(i = 0; i < len1; i++)
{ // no point part
if (s1[len1 - 1 - i ] == '.')
{
continue;
}
a[biglen]=s1[len1 - 1 - i ] - '0';
biglen -= 1;
}
biglen = tempbiglen;
if (iprecision != 0)
biglen -= 1;
for(i = 0; i < len2; i++)
{
if (s2[len2 - 1 - i] == '.')
{
continue;
}
b[biglen]=s2[len2 - 1 - i] - '0';
biglen -= 1;
}
if (iprecision != 0)
tempbiglen -= 1;
for(i = tempbiglen; i >= 0; i--)
{
a[i] += b[i];
if(a[i] >= 10)
{
a[i] -= 10;
a[i-1]++;
}
}
printf("The add result is :\n");
if(a[0] != 0)
{
printf("Add one data to the highest bit\n");
for(i = 0; i <= tempbiglen; i++)
{
if (iprecision == 0)
{
// printf("%d",a[i]);
memset(temp_conv,0,sizeof(temp_conv));
sprintf(temp_conv,"%d",a[i]);
strcat(add_ret,temp_conv);
}
else
{
if (i == tempbiglen - iprecision + 1)
{
// printf(".");
strcat(add_ret,".");
}
// printf("%d",a[i]);
memset(temp_conv,0,sizeof(temp_conv));
sprintf(temp_conv,"%d",a[i]);
strcat(add_ret,temp_conv);
}
}
}
else
{
printf("The highest bit no add data\n");
for(i = 1; i <= tempbiglen; i++)
{
if (iprecision == 0)
{
// printf("%d",a[i]);
memset(temp_conv,0,sizeof(temp_conv));
sprintf(temp_conv,"%d",a[i]);
strcat(add_ret,temp_conv);
}
else
{
if (i == tempbiglen - iprecision + 1)
{
// printf(".");
strcat(add_ret,".");
}
// printf("%d",a[i]);
memset(temp_conv,0,sizeof(temp_conv));
sprintf(temp_conv,"%d",a[i]);
strcat(add_ret,temp_conv);
}
}
}
printf("add_ret = %s\n",add_ret);
return 0;;
}


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: