⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmicalculator.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -