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

📄 main.cpp

📁 用于实现巨大数字的常用运算处理。可以实现四则运算等。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			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 + -