/*-------------------------------------------------------------------------- *函數名稱: 大數除法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 ;
}
|