📄 mmicalculator.c
字号:
memset(ff,0,MAXLEN);
memset(si,0,MAXLEN);
memset(sf,0,MAXLEN);
memset(s,0,MAXLEN);
memset(t,0,MAXLEN);
memset(sTemp,0,MAXLEN);
i=0;
while( str1[i]!='.'&&(i<strlen(str1)) )
i++;
strncpy(fi,str1,i);
if( i<strlen(str1) )
strcpy(ff,str1+i+1);
i=0;
while( str2[i]!='.'&&(i<strlen(str2)) )
i++;
strncpy(si,str2,i);
if( i<strlen(str2) )
strcpy(sf,str2+i+1);
memset(temp_mark,0,2);
strcpy(temp_mark,mark);
signal=stringchange(fi,ff,si,sf,temp_mark);
switch( temp_mark[0] )
{
case '+':
i = strlen(ff);
j = strlen(sf);
strcpy(s, ff);
strcpy(t, sf);
if( i < j )
{
k = i;
i = j;
j = k;
strcpy(s, sf);
strcpy(t, ff);
}
if( i > 0 )
{ //has fraction
strcpy(ff, s+j);
s[j] = t[j] = 0;
while( j >= STEP_LEN )
{
v1 = atol(s+j-STEP_LEN);//j-8
v2 = atol(t+j-STEP_LEN)+carry;//j-8
v1 += v2;
carry = 0;
if( v1 >= HUNDRED_MILLION )
carry = 1;
sprintf(sTemp, "%0*ld", STEP_LEN, v1);
sprintf(sf,"%s%s",sTemp+carry,ff);
strcpy(ff,sf);
j -= STEP_LEN;
s[j] = t[j] = 0;
}
if( j > 0 )
{
v1 = atol(s);
v2 = atol(t)+carry;
v1 += v2;
carry = 0;
sprintf(sTemp, "%0*ld", j, v1);
if( strlen(sTemp)>j )
carry = 1;
sprintf(sf,"%s%s",sTemp+carry,ff);
strcpy(ff,sf);
}
}
//integer section
k = i = strlen(fi);
j = strlen(si);
strcpy(s, fi);
strcpy(t, si);
if( i < j )
{
k = j;
j = i;
i = k;
strcpy(s, si);
strcpy(t, fi);
}
if( 1 )
{//has integer
fi[0] = 0;
while( j >= STEP_LEN )
{
v1 = atol(s+i-STEP_LEN);//i-8
v2 = atol(t+j-STEP_LEN)+carry;//j-8
v1 += v2;
carry = 0;
if( v1 >= HUNDRED_MILLION )
carry = 1;
sprintf(sTemp, "%0*ld", STEP_LEN, v1);
sprintf(si,"%s%s",sTemp+carry,fi);
strcpy(fi,si);
i -= STEP_LEN;
j -= STEP_LEN;
s[i] = t[j] = 0;
}
if( j > 0 )
{
v1 = atol(s+i-j);
v2 = atol(t)+carry;
v1 += v2;
carry = 0;
sprintf(sTemp, "%0*ld", j, v1);
if( strlen(sTemp)>j )
carry = 1;
sprintf(si,"%s%s", sTemp+carry, fi);
strcpy(fi,si);
i -= j;
s[i] = 0;
}
//more than t
while( i >= STEP_LEN )
{
v1 = atol(s+i-STEP_LEN)+carry;
carry = 0;
if( v1 >= HUNDRED_MILLION )
carry = 1;
sprintf(sTemp, "%0*ld", STEP_LEN, v1);
sprintf(si, "%s%s", sTemp+carry, fi);
strcpy(fi, si);
i -= 8;
s[i] = 0;
}
if( i >= 0 )
{
v1 = atol(s)+carry;
carry = 0;
sprintf(sTemp, "%ld", v1);
if( strlen(sTemp)>j )
carry = 1;
sprintf(si, "%s%s", sTemp, fi);
strcpy(fi, si);
}
}
break;
case '-':
strcpy(s,ff);
strcpy(t,sf);
//s - t fraction
i = strlen(s);
j = strlen(t);
if( i | j )
{ //fraction
ff[0] = 0;
while( i<=j-STEP_LEN )
{
v1 = HUNDRED_MILLION-carry;
carry = 1;
v2 = atol(t+j-STEP_LEN);
v1 = (v1 - v2)%HUNDRED_MILLION;
sprintf(sTemp,"%0*ld", STEP_LEN, v1);
sprintf(sf, "%s%s",sTemp, ff);
strcpy(ff, sf);
j -= STEP_LEN;
t[j] = 0;
}
if( i < j )
{
v1 = pow10(j-i)-carry;
carry = 1;
v2 = atol(t+i);
v1 = (v1 - v2)%pow10(j-i);
sprintf(sTemp, "%0*ld",j-i, v1);
sprintf(sf, "%s%s",sTemp, ff);
strcpy(ff, sf);
j = i;
t[j] = 0;
}
if( i > j )
{
strcpy(ff, s+j);
i = j;
s[j] = 0;
}
while( i >= STEP_LEN )
{
v1 = atol(s+i-STEP_LEN)-carry;
v2 = atol(t+j-STEP_LEN);
carry = (v1 < v2);
v1 = (v1 + carry*HUNDRED_MILLION - v2);
sprintf(sTemp, "%0*ld", STEP_LEN, v1);
sprintf(sf, "%s%s", sTemp, ff);
strcpy(ff, sf);
i -= STEP_LEN;
j -= STEP_LEN;
s[i] = t[j] = 0;
}
if( i > 0 )
{
v1 = atol(s)-carry;
v2 = atol(t);
carry = (v1 < v2);
v1 = (v1 + carry*pow10(i) - v2);
sprintf(sTemp, "%0*ld", i, v1);
sprintf(sf, "%s%s", sTemp, ff);
strcpy(ff, sf);
}
}
strcpy(s, fi);
strcpy(t, si);
i = strlen(s);
j = strlen(t);
fi[0] = 0;
while( j >= STEP_LEN )
{
v1 = atol(s+i-STEP_LEN)-carry;
v2 = atol(t+j-STEP_LEN);
carry = (v1 < v2);
v1 = (v1+carry*HUNDRED_MILLION - v2);
sprintf(sTemp, "%0*ld", STEP_LEN, v1);
sprintf(si, "%s%s", sTemp, fi);
strcpy(fi, si);
i -= STEP_LEN;
j -= STEP_LEN;
s[i] = t[j] = 0;
}
if( j > 0 )
{
v1 = atol(s+i-j)-carry;
v2 = atol(t);
carry = (v1 < v2);
v1 = (v1+carry*pow10(j) - v2);
sprintf(sTemp, "%0*ld", j, v1);
sprintf(si, "%s%s", sTemp, fi);
strcpy(fi, si);
i -= j;
s[i] = 0;
}
while( i >= STEP_LEN )
{
v1 = atol(s+i-STEP_LEN)-carry;
carry=0;
if( v1 < 0 )
{
carry = 1;
v1 += HUNDRED_MILLION;
}
sprintf(sTemp, "%0*ld", STEP_LEN, v1);
sprintf(si, "%s%s", sTemp, fi);
strcpy(fi, si);
i -= STEP_LEN;
s[i] = 0;
}
if( i > 0 )
{
v1 = atol(s) - carry;
sprintf(sTemp, "%0*ld", i, v1);
sprintf(si, "%s%s", sTemp, fi);
strcpy(fi, si);
}
break;
case '*':
i = strlen(fi);
j = strlen(si);
k = sprintf(s,"%s%s",fi,ff);
amp = k - i;
off = 0;
while( s[off]=='0'&&s[off+1]>='0'&&s[off+1]<='9' )
off++;
if( off )
strcpy(s, s+off);
k = sprintf(t,"%s%s",si,sf);
amp += k - j;
off = 0;
while( t[off]=='0'&&t[off+1]>='0'&&t[off+1]<='9' )
off++;
if( off )
strcpy(t, t+off);
i = strlen(s);
j = strlen(t);
if( i+j > (STEP_LEN+1) )
{
amp -= i+j - (STEP_LEN+1);
if( i < 5 )
j = (STEP_LEN+1)-i;
else if( j < 5 )
i = (STEP_LEN+1)-j;
else
{
i = 4;
j = (STEP_LEN+1)-i;
}
s[i] = 0;
t[j] = 0;
}
v1 = atol(s);
v2 = atol(t);
v1 *= v2;
k = sprintf(sTemp, "%lu", v1);
if( amp < 0 )
{
sprintf(fi,"%s%0*d",sTemp,(-amp),0);
ff[0] = 0;
}
else if( k >= amp )
{
sprintf(ff, "%s", sTemp+k-amp);
sTemp[k-amp] = 0;
strcpy(fi, sTemp);
}
else
{
sprintf(ff, "%0*d%s", amp-k, 0, sTemp);
strcpy(fi, "0");
}
break;
case '/':
i = strlen(fi);
j = strlen(si);
k = sprintf(s,"%s%s",fi,ff);
amp = k - i;
off = 0;
while( s[off]=='0'&&s[off+1]>='0'&&s[off+1]<='9' )
off++;
if( off )
strcpy(s, s+off);
k = strlen(s);
if( k < (STEP_LEN+1) )
{
amp += (STEP_LEN+1) - k;
sprintf(s+k, "%0*d", (STEP_LEN+1)-k, 0);
}
else
{
amp -= k - (STEP_LEN+1);
s[(STEP_LEN+1)] = 0;
}
v1 = atol(s);
k = sprintf(t,"%s%s",si,sf);
shr = k - j;
off = 0;
while( t[off]=='0'&&t[off+1]>='0'&&t[off+1]<='9' )
off++;
if( off )
strcpy(t, t+off);
k = strlen(t);
if( k >= DIV_LEN )
{
shr -= k-DIV_LEN;
t[DIV_LEN] = 0;
}
v2 = atol(t);
if( v2==0 )
{
strcpy(fi,"0");
ff[0] = 0;
return 0;
}
v1 /= v2;
memset(sTemp,0, sizeof(sTemp));
i = sprintf(sTemp, "%ld", v1);
j = i + shr - amp;
ff[0] = 0;
if( j > i )
{
sprintf(fi,"%s%0*d",sTemp,j-i,0);
ff[0] = 0;
}
else if( j >= 0 )
{
sprintf(ff,"%s", sTemp+j);
sTemp[j] = 0;
strcpy(fi, sTemp);
}
else
{
strcpy(fi, "0");
sprintf(ff,"%0*d%s", amp-i-shr, 0, sTemp);
}
if( !strlen(fi) )
strcpy(fi,"0");
TRACE_EVENT(ff);
break;
default:
break;
}
strcpy(result_s,fi);
if( strlen(ff) )
{
strcat(result_s,".");
strcat(result_s,ff);
}
return signal;
}
int stringchange(char *fi,char *ff,char *si,char *sf,char *mark)
{
char string[MAXLEN],stri[MAXLEN],strf[MAXLEN];
int i,j,k,l,m,n;
int sig=1;
memset(string,0,MAXLEN);
memset(stri,0,MAXLEN);
memset(strf,0,MAXLEN);
switch( mark[0] )
{
case '+':
if( (fi[0]=='-')&&(si[0]=='-') )
{
sig=0;
strcpy(string,fi+1);
strcpy(fi,string);
strcpy(string,si+1);
strcpy(si,string);
}
if( (fi[0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -