| /*-------------------------------------------------------------------------- *函数名称: 大数除法2--
 *函数想法:1 用指针指向除数的最高位,保存临时字符串; tempstr[a++] = pna
 * 2 如果临时字符串大于被除数,则相减。结果等于余数
 * if(tempstr>numb)tempstr = tempstr - numb
 * 3 如果小于被除数且指针到头,余数 等于 临时字符串
 * if(tempstr
            *
 *入口参数:numa,numb,result,remainder字符串
 *出口参数:无
 *--------------------------------------------------------------------------*/
 
 void divide2( char *numa, char *numb,char *result,char *remainder)//计算除法2
            {
            char one[]="1";//临时字符串....
            char one2[]="1";//
            char zero[]="0";//
            char numb2[6048];//
            char tempstr[6018]="";//临时字符串
            int  ia=0,ia2=0;//tempstr的指示器
            bool  moveon=false;//翻转牌
            char *pna = numa;//指向numa的一个指针。point numa      pna 指向减数的最低位,
            char *pnb = findend(numb);//指向numb的一个指针                 //pnb 指向被减数的最低位,
            Node *head,   // 用于存贮头指针
            *pstart,  // 用于存贮计算时的首指针
            *pnew;    //作于申请新结点
            head = pstart =new Node;//初始化首结点和头结点。
            pstart -> data = 0;
            pstart -> next = NULL;
            pstart -> ahead = NULL;
            moveon = false;
            while(*pna)
            {
            if(!pstart->next)//如果当前为空结点,则申请新结点
            {
            pnew = new Node;
            pnew -> data = 0;
            pnew -> next = NULL;
            pnew -> ahead = pstart;
            pstart -> next = pnew;
            }
            ia=(int)strlen(tempstr);//取的长度
            tempstr[ia++] = *(pna++);
            tempstr[ia] ='\0'; //转换为字符串
            if(tempstr[0]=='0')//处理高位也是0的那种 如00
            {
            ia2=0;
            while(tempstr[ia2]=='0')++ia2;
            while(ia2>=1)//清除无用的0
            {
            ia=ia2-1;
            tempstr[ia]=tempstr[ia2];
            --ia2;
            }
            tempstr[++ia2]='\0';
            }
            while(abigerb(tempstr,numb)>0)//如果tempstr大于等于numb
            {
            if(tempstr[0]=='0')//处理高位也是0的那种 如00----此乃冗余代码,留做记念用
            {
            ia2=0;
            while(tempstr[ia2]=='0')++ia2;
            if(ia==ia2 )
            {
            moveon = true;
            break;
            }
            }
            strcpy(numb2,numb);
            subtract(tempstr, numb,tempstr);//A-B
            strcpy(numb,numb2);
            if(tempstr[0]=='-')//若判断的不准,变为了负数就再加上B。。
            {
            strcpy(numb2,numb);
            addition(tempstr, numb,tempstr);//A-B
            strcpy(numb,numb2);
            ia2=0; //修正之后的长度。因为加法中未做负数运算
            ia=0;  //为了消除最后的那一个负号,整体向前移动。
            while(tempstr[ia2]!='\0')++ia2;
            while(ia2>=1)//清除无用的0
            {
            tempstr[ia]=tempstr[ia+1];
            ++ia;
            --ia2;
            }
            tempstr[ia]='\0';
            moveon = true;
            break;
            }
            pstart->data++ ; //结果自加
            moveon = true;
            }
            if(moveon) pstart = pstart -> next;          //结点移动
            }
            strcpy(remainder,tempstr);//存贮余数
            int tip = 0;//转为字符串用
            pstart =head;//寻找链表的结尾点
            while(pstart->next != 0)
            {
            pstart->data += 48;//!!<<<因为我们的输出是字符。所以再此加上48>>>>  逆顺输出
            result[tip++] = pstart->data;
            pstart = pstart->next ;
            }
            result[tip] = '\0';//存贮结果
            pstart =head;  //释放空间
            while(pstart->next != 0)
            {
            pnew = pstart->next ;delete pstart;
            pstart =pnew;
            }
            return ;
            }
             |