前些天去企鹅刷笔试,遇到一题给出两个100位的数据,10进制,让写出算法求和并输出。当时稀里糊涂写了一通,结果很显然。。。
现在回来整理一下。
#include <stdio.h>
#include <string.h>
#define RADIX 10
char* strrev(char* buf)
{
int i=0,len=0;
char tmp;
len=strlen(buf);
if(0==len)
return NULL; for(;i<len/2;i++)
{
tmp=buf[i];
buf[i]=buf[len-1-i];
buf[len-1-i]=tmp;
}
return buf;
}
char *add(char *ret, char *param1, char *param2)
{
int i = 0; /* ans 的索引 */
int carry = 0; /* 进位, 初始为0 */
char *strA = strrev(param1);
char *strB = strrev(param2);
do
{
carry += (*strA &0xf) + (*strB & 0xf);
ret[i++] = carry % RADIX + '0';
carry /= RADIX;
} while (*(++strA) && *(++strB)); /*指针先自增,后判断*/
ret[i]=carry;
while(*(++strA))/*如果strA里还有字符*/
{
if(ret[i]=='0')
ret[i++]= *(strA);
else
ret[i++]+= *(strA);
}
while(*(++strB))
{
if(ret[i]=='0')
ret[i++]= *(strB);
else
ret[i++] += *strB;
}
ret[i] = '\0'; /*结束符*/
strrev(param1);
strrev(param2);
return strrev(ret);
} int main()
{
char first[255] = "12345678900000009234567890";
char second[255] = "12345678900000001234567890";
char ans[256]={0};
char*p=add(ans, first, second);
printf("ans=%s\np:%s\n", ans,p);
return 0;
}
大体的思路就是:将加数param1 及被加数param2以字符串存储,作为待处理主体,然后分别逆序字符串,将低位置前。while遍历同步记录进位。然后将结果再做逆序还原处理即可,这地方要注意当两个操作数中位数较短的数据遍历完后要记得处理这时有没有进位