- 论坛徽章:
- 0
|
这是我写的一个支持很长字串的除法,在SCO和AIX上都跑过一些,不过肯定存在未发现的BUG,程序暂时没有加上注释,望大家先把它编译后运行,找出一些出错的数据反馈给我,谢谢,运行是命令+小数需要精确的位数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char result[1024], szCs[1024];
long slen, si;
int main(int argc, char *argv[])
{
char divdata1[1024], divdata2[1024];
long len1, len2;
int k, iRet, flag, s;
si = len1 = len2 = flag = 0;
if(argc < 2)
{
printf("请输入小数精确位数!Usage: commad 1\n");
return -1;
}
memset(divdata1, 0x00, sizeof(divdata1));
memset(divdata2, 0x00, sizeof(divdata2));
memset(result, 0x00, sizeof(result));
memset(szCs, 0x00, sizeof(szCs));
printf("请输入除数:");
scanf("%s", divdata1);
strcpy(szCs, divdata1);
printf("请输入被除数:");
scanf("%s", divdata2);
len1 = strlen(divdata1);
slen = len1 - 1;
len2 = strlen(divdata2);
k = atoi(argv[1]);
if(k != 0)
{
memset(divdata1+len1, '0', k);
divdata1[len1+k] = '\0';
len1 = strlen(divdata1);
slen = len1 - 1;
strcpy(szCs, divdata1);
}
if(isright(divdata1) != 0)
{
printf("请检查除数的合法性!\n");
return 1;
}
if(isright(divdata2) != 0)
{
printf("请检查被除数的合法性!\n");
return 1;
}
if(len2 > len1)
{
printf("运算结果=0\n");
flag = 1;
}
else if(len2 == len1)
{
iRet = issame(divdata1, divdata2, len1);
if(iRet == 0)
{
printf("运算结果=1\n");
flag = 1;
}
else if(iRet == 1)
{
si = strlen(divdata1) - 1;
procdiv(divdata1, divdata2, result);
}
else if(iRet == 2)
{
printf("运算结果=0\n");
flag = 1;
}
}
else
{
char szTmp[1024];
memset(szTmp, 0x00, sizeof(szTmp));
strncpy(szTmp, divdata1, len2);
iRet = issame(szTmp, divdata2, len2);
if(iRet == 1 || iRet == 0)
{
si = strlen(szTmp) - 1;
procdiv(szTmp, divdata2, result);
}
else
{
memset(szTmp, 0x00, sizeof(szTmp));
strncpy(szTmp, divdata1, len2+1);
si = strlen(szTmp) - 1;
procdiv(szTmp, divdata2, result);
}
}
len1 = strlen(result);
/*
change(0, len1-1, result);
*/
if(flag == 0)
{
if(k != 0)
{
result[len1+1] = '\0';
for(s = 0; s < k; s++)
{
result[len1] = result[len1-1];
len1--;
}
result[len1] = '.';
}
printf("运算结果=%s\n", result);
}
return 0;
}
int change(long low, long high, char *databuf)
{
char sztmp;
if(low > high)
return 0;
sztmp = databuf[low];
databuf[low] = databuf[high];
databuf[high] = sztmp;
change(low+1, high-1, databuf);
}
int issame(char *szbuf1, char *szbuf2, long len)
{
long iret, i, j;
i = j = 0;
while(len > 0)
{
if(szbuf1 == szbuf2[j])
{
i++;
j++;
len--;
}
else if(szbuf1 > szbuf2[j])
return 1;
else
return 2;
}
return 0;
}
int isright(char *szbuf)
{
long i, len;
i = 0;
len = strlen(szbuf);
while(len > 0)
{
if(szbuf[0] == '0')
return 1;
if(szbuf < '0' || szbuf > '9')
return 1;
i++;
len--;
}
return 0;
}
int procdiv(char *szdata1, char *szdata2, char *result)
{
long len1, len2, i, j, k;
int sztag, data1, data2, iret, n, m;
char szys[1024], szbuf[1024];
memset(szys, 0x00, sizeof(szys));
memset(szbuf, 0x00, sizeof(szbuf));
i = j = k = sztag = 0;
/*
printf("si = [%d], slen = [%d], data1=[%s], data2=[%s]\n", si, slen, szdata1, szdata2);
*/
if(si > slen)
return 0;
len1 = strlen(szdata1);
len2 = strlen(szdata2);
if(len1 < len2)
{
strcat(result, "0");
strncat(szdata1, szCs+si+1, 1);
si++;
procdiv(szdata1, szdata2, result);
}
else if(len1 > len2)
{
len2 = strlen(szdata2);
change(0, len2-1, szdata2);
for(n = 9; n > 0; n--)
{
iret = funcmul(szdata1, szdata2, szbuf, n, &m);
if(iret == 2)
{
char c[2];
c[0] = m + '0';
c[1] = '\0';
strcat(result, c);
/*
printf("result = [%s]\n", result);
*/
break;
}
}
len1 = strlen(szdata1);
change(0, len1-1, szdata1);
len2 = strlen(szbuf);
len1--;
/*
printf("data1 = [%s], data2 = [%s]\n", szdata1, szbuf);
*/
while(len2 > 0)
{
data1 = szdata1-'0';
data2 = szbuf[j]-'0';
data1 = data1 - sztag;
if(data1 == data2)
{
szys[k] = '0';
i++;
j++;
k++;
sztag = 0;
len2--;
}
else if(data1 > data2)
{
int d;
d = data1 - data2;
szys[k] = d + '0';
i++;
j++;
k++;
sztag = 0;
len2--;
}
else
{
int d;
d = data1 + 10 - data2;
szys[k] = d + '0';
i++;
j++;
k++;
sztag = 1;
len2--;
}
}
/***
if(len1 != 0)
sztag = szdata1[len1] - '0' - sztag;
***/
/*
printf("k11 = [%d], szys11 = [%s]\n", k, szys);
*/
if(szys[k-1] == '0')
pub_trim(szys);
/****
if(sztag != 0)
{
szys[k] = sztag + '0';
szys[k+1] = '\0';
}
else
*******/
szys[k] = '\0';
memset(szdata1, 0x00, sizeof(szdata1));
/*
printf("k = [%d], szys = [%s] \n", k, szys);
*/
strcpy(szdata1, szys);
len1 = strlen(szdata1);
change(0, len1-1, szdata1);
len2 = strlen(szdata2);
change(0, len2-1, szdata2);
strncat(szdata1, szCs+si+1, 1);
si++;
procdiv(szdata1, szdata2, result);
}
else
{
iret = issame(szdata1, szdata2, len1);
if(iret == 2)
{
strcat(result, "0");
if(szdata1[0] == '0')
memset(szdata1, 0x00, sizeof(szdata1));
strncat(szdata1, szCs+si+1, 1);
si++;
procdiv(szdata1, szdata2, result);
return 0;
}
else if(iret == 0)
{
strcat(result, "1");
memset(szdata1, 0x00, sizeof(szdata1));
strncat(szdata1, szCs+si+1, 1);
si++;
procdiv(szdata1, szdata2, result);
return 0;
}
len2 = strlen(szdata2);
change(0, len2-1, szdata2);
for(n = 9; n > 0; n--)
{
iret = funcmul(szdata1, szdata2, szbuf, n, &m);
if(iret == 2)
{
char c[2];
c[0] = m + '0';
c[1] = '\0';
strcat(result, c);
/*
printf("result = [%s]\n", result);
*/
break;
}
}
len1 = strlen(szdata1);
change(0, len1-1, szdata1);
len2 = strlen(szbuf);
len1--;
while(len2 > 0)
{
data1 = szdata1-'0';
data2 = szbuf[j]-'0';
data1 = data1 - sztag;
if(data1 == data2)
{
szys[k] = '0';
i++;
j++;
k++;
sztag = 0;
len2--;
}
else if(data1 > data2)
{
int d;
d = data1 - data2;
szys[k] = d + '0';
i++;
j++;
k++;
sztag = 0;
len2--;
}
else
{
int d;
d = data1 + 10 - data2;
szys[k] = d + '0';
i++;
j++;
k++;
sztag = 1;
len2--;
}
}
szys[k] = '\0';
if(szys[k-1] == '0')
pub_trim(szys);
memset(szdata1, 0x00, sizeof(szdata1));
/*
printf("szys = [%s] ", szys);
*/
strcpy(szdata1, szys);
len1 = strlen(szdata1);
change(0, len1-1, szdata1);
len2 = strlen(szdata2);
change(0, len2-1, szdata2);
strncat(szdata1, szCs+si+1, 1);
/*
printf("iiiii szdata1 = [%s]\n", szdata1);
*/
si++;
procdiv(szdata1, szdata2, result);
}
return 0;
}
int funcmul(char *szdata1, char *szdata2, char *szbuf, int n, int *m)
{
int sztag, i, j, d, iret;
long len, len1;
char sztmp[1024];
memset(sztmp, 0x00, sizeof(sztmp));
sztag = i = j = 0;
len = strlen(szdata2);
while(len > 0)
{
d = szdata2 - '0';
d = d * n + sztag;
if( d >= 10)
sztag = d / 10;
else
sztag = 0;
sztmp[j] = d - (d/10)*10 + '0';
j++;
i++;
len--;
}
if(sztag != 0)
sztmp[j] = sztag + '0';
sztmp[j+1] = '\0';
/*
printf("sztmp = [%s], szdata2 = [%s]\n", sztmp, szdata2);
*/
strcpy(szbuf, sztmp);
len = strlen(szdata1);
len1 = strlen(sztmp);
if(len < len1)
return 1;
else if(len > len1)
{
*m = n;
return 2;
}
change(0, len1-1, sztmp);
iret = issame(szdata1, sztmp, len1);
if(iret == 1 || iret == 0)
{
*m = n;
return 2;
}
return 1;
}
int pub_trim(char *szbuf)
{
long i, n, j;
j = i = strlen(szbuf)-1;
n = 0;
while(i >= 0)
{
if(szbuf == '0')
n++;
else
break;
i--;
}
if(i < 0)
{
memset(szbuf, 0x00, sizeof(szbuf));
return 0;
}
strncpy(szbuf, szbuf, j-n);
szbuf[j-n+1] = '\0';
return n;
} |
|