-
-
[原创]解析字符串大数加减法
-
发表于:
2011-11-10 13:35
6224
-
娱乐娱乐,很菜的代码,第一个加法代码百度来的,减法自己写的,让各位大牛笑话了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
char *String="你54839865486548650468054658847397577599他554238599778899934566666666666666666666999999999999999999999999我8888888888888888888888888888888888888";
void Memcpy(void *Str1,void *Str2)
{
char *szTemp1=Str1;
char *szTemp2=Str2;
memset(Str1,0,strlen(Str1));
while(*szTemp2>=0x30&&*szTemp2<=0x39)
{
*szTemp1=*szTemp2;
szTemp1++;
szTemp2++;
}
}
/************************************
大数加法
************************************/
void Add(char *dst,char *src)
{
int i=0;
int j=0;
int k = 0;
char tmp[MAX_PATH];
memset(tmp,0,MAX_PATH);
for (i = strlen(dst)-1,j = strlen(src)-1;i >= 0 && j >= 0;--i,--j)
tmp[k++] = dst[i]+src[j]-0x30-0x30;
for (;i >= 0;--i)
tmp[k++] = dst[i]-0x30;
for (;j >= 0;--j)
tmp[k++] = src[j]-0x30;
tmp[k] = 0;
for (i = 0;i < k;++i)
{
tmp[i+1] += tmp[i]/10;
tmp[i] %= 10;
}
if (!tmp[k])
--k;
for (i = 0;i <= k;++i)
dst[i] = tmp[k-i] + '0';
dst[k+1] = '\0';
}
/************************************
大数减法
************************************/
void Sub(char *dst,char *src)
{
int dstLen=strlen(dst)-1;
int srcLen=strlen(src)-1;
int k=0;
char temp[MAX_PATH];
memset(temp,0,MAX_PATH);
if(*dst==0)
{
return;
}
for(;dstLen>=0&&srcLen>=0;--dstLen,--srcLen)
{
if(dst[dstLen]<src[srcLen])
{
temp[k++]=(0xA+(dst[dstLen]-src[srcLen]));
dst[dstLen-1]-=1;
}
else{
temp[k++]=dst[dstLen]-src[srcLen];
}
}
for(;dstLen>=0;--dstLen)
{
temp[k++]=dst[dstLen]-0x30;
}
if(!temp[k])
--k;
for (dstLen = 0;dstLen <= k;++dstLen)
dst[dstLen] = temp[k-dstLen] + '0';
dst[k+1] = '\0';
}
int main(void)
{
char szAddSum[MAX_PATH];
char szSubSum[MAX_PATH];
char szTemp[MAX_PATH];
memset(szAddSum,0,MAX_PATH);
memset(szSubSum,0,MAX_PATH);
memset(szTemp,0,MAX_PATH);
char *stemp=String;
while(*stemp)
{
stemp++;
while(*stemp>=0x30&&*stemp<=0x39)
{
Memcpy(szTemp,stemp);
stemp+=lstrlen((char*)szTemp)+1;
Add(szAddSum,szTemp);
}
}
printf("add sum is:%s\n",szAddSum);
while(*String)
{
String++;
while(*String>=0x30&&*String<=0x39)
{
Memcpy(szTemp,String);
String+=lstrlen((char*)szTemp)+1;
Sub(szAddSum,szTemp);
printf("sub sum is:%s\n",szAddSum);
}
}
system("pause");
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课