📄 main.cpp
字号:
{
c.locate_delete(cp);
c.InsertNode(cp,tempc);
isNeed=false;
}
}
}
//单项相乘
void simp_multi(lk_list<node> a,node s,lk_list<node> & b)
{
int alength,i;
node tempa,tempb;
alength=a.ListLength();
for(i=1;i<=alength;i++)
{
a.GetValue(i,tempa);
tempb.data=tempa.data*s.data;
tempb.value=tempa.value+s.value;
b.InsertEnd(tempb);
}
}
//对数字链表进行整理
void settle(lk_list<node> & a)
{
int toNext=0,ap;
node tempa;
for(ap=1;ap<=a.ListLength();ap++)
{
a.GetValue(ap,tempa);
tempa.data=tempa.data+toNext;
toNext=(tempa.data)/10;
tempa.data=tempa.data-10*toNext;
a.locate_delete(ap);
a.InsertNode(ap,tempa);
}
if(toNext!=0)
{
a.GetValue(a.ListLength(),tempa);
tempa.data=toNext;
tempa.value++;
a.InsertEnd(tempa);
}
}
//作乘法的函数
void multi(lk_list<node> a,lk_list<node> b,lk_list<node> &c)
{
lk_list<node> simple,carrier;
node temp;
int i,j,aLength,bLength;
aLength=a.ListLength();
bLength=b.ListLength();
for(i=1;i<=aLength;i++)
{
a.GetValue(i,temp);
simp_multi(b,temp,simple);
settle(simple);
add(simple,c,carrier);
simple.ClearList();
c.ClearList();
for(j=1;j<=carrier.ListLength();j++)
{
carrier.GetValue(j,temp);
c.InsertEnd(temp);
}
carrier.ClearList();
}
}
//将a拷贝到b中
void list_copy(lk_list<node> & a,lk_list<node> & b)
{
node temp;
int j;
b.ClearList();
for(j=1;j<=a.ListLength();j++)
{
a.GetValue(j,temp);
b.InsertEnd(temp);
}//a的内容存入b中
}
//找到最大除数
void maxDiv(lk_list<node> & a,lk_list<node> & b,lk_list<node> & valueDiffer)
{
int lengtha,lengthb,n,i;
node firsta,firstb,temp;
lk_list<node> closeNum;
valueDiffer.ClearList();
lengtha=a.ListLength();
lengthb=b.ListLength();
for(i=lengtha;i>=1;i--)
{
a.GetValue(i,firsta);
if(firsta.data==0) continue;
else break;
}//从高位到低位找第一个不为零的那位数
for(i=lengthb;i>=1;i--)
{
b.GetValue(i,firstb);
if(firstb.data==0) continue;
else break;
}//从高位到低位找第一个不为零的那位数
n=firsta.value-firstb.value;
temp.data=1;
temp.value=n;
valueDiffer.InsertEnd(temp);
add_zero(valueDiffer);
multi(valueDiffer,b,closeNum);//乘法函数
if(compare(a,closeNum)==-1) n--;
else if(compare(a,closeNum)==0) return;
else {}
for(i=1;i<=9;i++)
{
closeNum.ClearList();
valueDiffer.ClearList();
temp.data=i;
temp.value=n;
valueDiffer.InsertEnd(temp);
add_zero(valueDiffer);
multi(valueDiffer,b,closeNum);
if(compare(a,closeNum)==1) continue;
else if(compare(a,closeNum)==0) return;
else break;
}
i=i-1;
temp.data=i;
temp.value=n;
valueDiffer.ClearList();
valueDiffer.InsertNode(1,temp);
}
void display(lk_list<node> &a)
{
node temp;
int i;
for(i=1;i<=a.ListLength();i++)
{
a.GetValue(i,temp);
cout<<"** "<<temp.data<<","<<temp.value<<endl;
}
}
//除法运算
void division(lk_list<node> & a,lk_list<node> & b,lk_list<node> & c)
{
node temp;//a,b的最高位数
int i,n=0;
lk_list<node> closeNum,valueDiffer,carrier;
//valueDiffer 用来找出a,b之间的最大除数
//valueDiffer*b=closeNum 逼近a的数
while(true)
{
maxDiv(a,b,valueDiffer);
//display(a);
for(i=1;i<=valueDiffer.ListLength();i++)
{
valueDiffer.GetValue(i,temp);
if(temp.data==0) continue;
else break;
}
c.InsertNode(1,temp);
n=temp.value;
closeNum.ClearList();//作乘法之前清空closeNum
multi(valueDiffer,b,closeNum);
subtration(a,closeNum,carrier);//作减法,将除后的余数存入carrier中
//display(carrier);
to_correct(carrier);
//display(carrier);
add_zero(carrier);
//display(carrier);
list_copy(carrier,a);
if(carrier.ListLength()==0) return;
carrier.ClearList();
valueDiffer.ClearList();
closeNum.ClearList();
if(n<-20) break;
}
}
//主函数
void main(void)
{
lk_list<node> number1,number2,result;
node temp,temp1,temp2;
char num1[100],num2[100];
char oper;
int i,j,p=0;
char choice;
bool isDecimal;
while(true)
{
system("cls");
design();
while(true)
{
cout<<"input the fist number:";
cin.getline(num1,100,'\n');
if(numTrue(num1)) break;
else cout<<"the number you input is error! ";
}
while(true)
{
cout<<"input the operation:";
cout.flush();
oper=getche();
cout<<endl;
if(oper=='+' || oper=='-' || oper=='*' || oper=='/') break;
else cout<<"the operation you input is error! ";
}
while(true)
{
cout.flush();
cout<<"input the next number:";
cin.getline(num2,100,'\n');
if(numTrue(num2)) break;
else cout<<"the number you input is error! "<<endl;
}
//--如果有小数点,将小数点后尾部的0去掉
//-------------------------------------------------
isDecimal=false;
for(i=0;i<100;i++)
{
if(num1[i]=='.') isDecimal=true;
if(num1[i]=='\0') break;
}
if(isDecimal==true)
{
for(j=i-1;j>=1;j--)
{
if(num1[j]=='0' || num1[j]=='.') num1[j]='\0';
else break;
}
}
//--------------------------
isDecimal=false;
for(i=0;i<100;i++)
{
if(num2[i]=='.') isDecimal=true;
if(num2[i]=='\0') break;
}
if(isDecimal==true)
{
for(j=i-1;j>=1;j--)
{
if(num2[j]=='0' || num2[j]=='.') num2[j]='\0';
else break;
}
}
//------------------------------------------------------
//--界面
//------------------------------------------------
system("cls");
design();
cout<<endl;
for(i=0;i<50;i++) cout<<"*";
cout<<endl;
cout<<"you want to do:";
for(i=0;i<100;i++)
{
if(num1[i]=='\0') break;
else cout<<num1[i];
}
cout<<oper;
for(i=0;i<100;i++)
{
if(num2[i]=='\0') break;
else cout<<num2[i];
}
cout<<endl;
for(i=0;i<50;i++) cout<<"*";
cout<<endl;
//-----------------------------------------------
//--将数字转存入链表
//-----------------------------------------------
convert(num1,number1);
convert(num2,number2);
//-----------------------------------------------
cout<<"the result:";
switch(oper)
{
case '+': add(number1,number2,result);break;
case '-': if(compare(number1,number2)==1)
{
subtration(number1,number2,result);
}
else if(compare(number1,number2)==-1)
{
cout<<"-";
subtration(number2,number1,result);
}
else cout<<"0"; break;
case '*': multi(number1,number2,result);break;
case '/': for(j=1;j<=number1.ListLength();j++)
{
number1.GetValue(j,temp1);
if(temp1.data==0) continue;
else break;
}
if(j==number1.ListLength()+1 && number1.ListLength()!=0) cout<<"0";
for(i=1;i<=number2.ListLength();i++)
{
number2.GetValue(i,temp2);
if(temp2.data==0) continue;
else break;
}
if(i!=number2.ListLength()+1 && number1.ListLength()!=0 && number2.ListLength()!=0)
{
division(number1,number2,result);add_zero(result);
}
else
{
cout<<"error!";
}
break;
default: return;
}
//对结果进行整理
//----------------------------------------------------
to_correct(result);
//--------------------------------------------------------
p=0;//害我调了好久@_@
for(i=result.ListLength();i>=1;i--)
{
result.GetValue(i,temp);
if(temp.value<0) {p=i; break;}
}
if(p==0)
{
for(i=result.ListLength();i>=1;i--)
{
result.GetValue(i,temp);
cout<<temp.data;
}
}
else if(p==result.ListLength())
{
cout<<"0.";
for(i=result.ListLength();i>=1;i--)
{
result.GetValue(i,temp);
cout<<temp.data;
}
}
else
{
for(i=result.ListLength();i>p;i--)
{
result.GetValue(i,temp);
cout<<temp.data;
}
cout<<".";
for(i=p;i>=1;i--)
{
result.GetValue(i,temp);
cout<<temp.data;
}
}
//--------------------------------------------------
number1.ClearList();
number2.ClearList();
result.ClearList();
for(i=0;i<100;i++)
{num1[i]='\0'; num2[i]='\0';}
cout<<endl<<"press any key to continue,and press Esc to exit...";
cout.flush();
choice=getch();
cout<<endl;
if(choice==27) break;
else continue;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -