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