求用C语言写的“大整数的四则运算”程序源代码,请看详细描述,刷分勿近!

RT,

大整数的四则运算。大整数指超过十位的十进制整数,这里为简便,假定不超过五十位。这类大整数在C语言系统中因超界溢出,是不能直接表达和计算的。可以用数组来表示大整数,在此基础上编写出实现大整数加、减、乘、除的程序,并努力加以优化。

要求:① 用C语言编写用

② 用数组存储整数

③ 数据存储采用文件形式

④ 只要加减乘除就行,不要开根,平方什么的!

9月14日,星期三之前就要,紧急!

有的请发到我邮箱![email protected]能用后即采纳,并加分!

/////这个是C++的,C++下比较模块化一点用的是字符串存储整数,比数组存储容易实现点。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////1. 输入形式为:A[空格或换行]O[空格或换行]B;
//// 2. 1中A、B为大数,O为运算符(如输入:123456789 / 432432);
//// 3. 既然处理大数,就没必要输入小数点位了;
//// 4.加减不能处理负号,乘除可以;
//// 5. 用于学习交流,若发现错误或不妥之处可联系
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
#include<string>
using namespace std;
class BigFigure{
string num1,num2;
string outcome;
int precision;
char operation;
public:
BigFigure(){
num1=num2="0";
outcome="0";
precision=5;
}
string& plus(string &, string &);
string& subtration(string &, string &);
string& multiplication(string &, string &);
string& division(string &, string &);
void show();
void BigFigureInterface();
string &revese(string&);
friend istream& operator>>(istream& i, BigFigure& a){
return i>>a.num1>>a.operation>>a.num2;
}
~BigFigure(){ }
};
void BigFigure::show(){
cout<<"Result: "<<outcome<<endl;
}
void BigFigure::BigFigureInterface(){
BigFigure a;
cout<<"*********************************************************/n";
cout<<" Welcome... /n";
cout<<" Four Arithmetic Operations of Big Figures/n";
cout<<"*********************************************************/n/n";
cout<<"Notes:/n";
cout<<" 1. 输入形式为:A[空格或换行]O[空格或换行]B。/n";
cout<<" 2. 1中A、B为大数,O为运算符(如输入:123456789 / 432432)。/n";
cout<<" 3. 既然处理大数,就没必要输入小数点位了。/n";
cout<<" 4. 加减不能处理负号,乘除可以。/n";
cout<<" 5. 用于学习交流,若发现错误可联系[email protected]。/n/n";
cout<<"Now Start, Input 0 0 0 to end if you want to quit!/n/n";
cout<<"[BigFigure #] ";
cin>>a;
while(a.operation!='0'){
switch(a.operation){
case '+': a.plus(a.num1, a.num2);
a.show(); break;
case '-': a.subtration(a.num1, a.num2);
a.show(); break;
case '*': a.multiplication(a.num1, a.num2);
a.show(); break;
case '/': a.division(a.num1, a.num2);
a.show(); break;
default:cout<<a.operation<<" is not Arithmetic Operation./n";
}
cout<<"[BigFigure #] ";
cin>>a;
}
system("cls");
cout<<"/n/n/n/n/n/n/t/t Quited.../n/n/n/n/n/n/n";
system("pause");
}

string& BigFigure::revese(string& s){
char c;
int t=s.size();
for(int i=0; i<t/2; i++){
c=s[i];
s[i]=s[t-i-1];
s[t-i-1]=c;
}
return s;
}
string& BigFigure::plus(string &str1, string &str2){//加法运算,未处理符号
int min=0,i,t=0;
string temp;
outcome.clear();
str1=revese(str1);
str2=revese(str2);
min=str1.size()<str2.size() ? str1.size() : str2.size();
for(i=0; i<min; i++){
temp+=(str1[i]+str2[i]-96+t)%10+48;
t=(str1[i]+str2[i]-96+t)/10;
}
if(min==str1.size()){
while(i<str2.size()){
temp+=(str2[i]+t-48)%10+48;
t=(str2[i]-48+t)/10;
i++;
}
if(t) temp+='1';
}
else{
while(i<str1.size()){
temp+=(str1[i]+t-48)%10+48;
t=(str1[i]-48+t)/10;
i++;
}
if(t) temp+='1';
}
outcome=revese(temp);
return outcome;
}

string &BigFigure::subtration(string &str1, string &str2){//减法运算,未处理符号
int min=0,flag,i,t=0;
string temp;
outcome.clear();
if(str1.size()>str2.size() || (str1.size()==str2.size() && str1.compare(str2)==1)){
str1=revese(str1);
str2=revese(str2);
flag=0;
min=str2.size();
}
else if(str1.size()==str2.size()){
if(!str1.compare(str2)){
outcome='0';
return outcome;
}
if(str1.compare(str2)==-1){
temp=str1;
str1=revese(str2);
str2=revese(temp);
flag=1;
min=str2.size();
}
}
else{
temp=str1;
str1=revese(str2);
str2=revese(temp);
flag=1;
min=str2.size();
}
temp.clear();
for(i=0; i<min; i++){
if(str1[i]-t<str2[i]){
temp+=str1[i]+10-t-str2[i]+48;
t=1;
}
else{
temp+=str1[i]-t-str2[i]+48;
t=0;
}
}
while(i<str1.size()){
if(!t){
while(i<str1.size()){
temp+=str1[i];
i++;
}
break;
}
if(str1[i]!='0'){ temp+=str1[i]-t; t=0; }
else temp+='9';
i++;
}
string s;
for(unsigned int k=temp.size()-1; k>=0; k--){
if(temp[k]!='0'){
for(int n=k; n>=0; n--)
s+=temp[n];
break;
}
}
if(flag) s='-'+s;
outcome=s;
return outcome;
}
string& BigFigure::multiplication(string &str1, string &str2){//乘法运算,已处理符号
char c='0',flag=0;
string temp1,temp2="0";
if(str1[0]=='0' || str2[0]=='0'){
outcome="0";
return outcome;
}
if(str1[0]=='-'){ flag++; str1.erase(0,1); }
if(str2[0]=='-'){ flag++; str2.erase(0,1); }
str1=revese(str1);
str2=revese(str2);
for(unsigned int i=0; i<str2.size(); i++){
c='0';
for(unsigned int j=0; j<str1.size(); j++){
temp1+=((str2[i]-48)*(str1[j]-48)+c-48)%10+48;
c=((str2[i]-48)*(str1[j]-48)+c-48)/10+48;
}
if(c!='0') temp1+=c;
temp1=revese(temp1);
for(int k=0; k<i; k++)
temp1+='0';
temp2=plus(temp1, temp2);
temp1.clear();
}
if(flag%2) temp2='-'+temp2;
outcome=temp2;
return outcome;
}

string& BigFigure::division(string &str1, string &str2){//除法运算,已处理符号
int str=0,flag=0,flag1=0,flag2=0;
string temp,temps,tempt;
if(str2=="0"){
outcome="Inf";
return outcome;
}
if(str2=="1" || str1=="0"){
outcome=str1;
return outcome;
}
if(str1[0]=='-'){ flag++; str1.erase(0,1); }
if(str2[0]=='-'){ flag++; str2.erase(0,1); }
for(unsigned int i=0; i<str1.size(); i++){//整除处理
str=0;
temp+=str1[i];
if(temp[0]=='0') temp.erase(0,1);
if(temp.size()>str2.size() ||
(temp.size()==str2.size() && temp.compare(str2)>=0)){
while(temp.size()>str2.size() ||
(temp.size()==str2.size() && temp.compare(str2)>=0)){
tempt=str2;
temp=subtration(temp, tempt);
str++;
}
temps+=str+48;
}
else if(temp.size()==str2.size() && temp.compare(str2)==0) temps+='1';
else temps+='0';
}
flag1=temps.size();
if(temp!="0" && precision) temps+='.';
for(int i=0; i<=precision && temp!="0"; i++){//小数后位的处理
str=0;
temp+='0';
if(temp.size()>str2.size() ||
(temp.size()==str2.size() && temp.compare(str2)>=0)){
while(temp.size()>str2.size() ||
(temp.size()==str2.size() &&temp.compare(str2)>=0)){
tempt=str2;
temp=subtration(temp, tempt);
str++;
}
temps+=str+48;
}
else if(temp.size()==str2.size() && temp.compare(str2)==0) temps+='1';
else temps+='0';
}
flag2=temps.size()-2;
if(temps[temps.size()-1]>='5' && flag2-flag1==precision){//四舍五入处理
temps.erase(flag1,1);
temps.erase(temps.size()-1, 1);
temp="1";
temps=plus(temps, temp);
if(temps.size()>flag2) temps.insert(flag1+1, 1, '.');
else temps.insert(flag1, 1, '.');
}
else if(flag2-flag1==precision) temps.erase(temps.size()-1, 1);
temp.clear();
for(unsigned int k=0; k<temps.size(); k++){//左端去零处理
if(temps[k]!='0' || temps[k+1]=='.'){
for(int n=k; n<temps.size(); n++)
temp+=temps[n];
break;
}
}
if(flag%2) temp='-'+temp;
outcome=temp;
return outcome;
}
int main(){//主函数
BigFigure a;
a.BigFigureInterface();
return 0;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-13

我怀疑你代码的这段有问题:
else if(ch == ')')
{
optr = MathOptr(ch);
while(!Stack1Empty(&OptrStack) && Peek1(&OptrStack).stackprecedence >= optr.inputprecedence) //问题可能在这儿
Evaluate(&OpndStack, Pop1(&OptrStack));
Pop1(&OptrStack);//将栈中的左括号弹出
k++;
ch = str[k];
}
你的左括号的优先级最高,所以当遇到左括号的时候,你的循环并不能退出,Evaluate还会继续计算,然而Evaluate里面的Switch语句里面没有针对'('的分支,所以你看不到任何反馈。要确定是不是这个问题,你可以在Evaluate里面填一条default语句测试一下:
void Evaluate(Stack * OpndStack, DataType1 optr)//执行从运算符栈弹出的运算符optr所要求的运算
{
DataType opnd1,opnd2;
opnd1 = Pop(OpndStack);
opnd2 = Pop(OpndStack);
switch(optr.op)
{
case'+': Push(OpndStack, opnd1+opnd2);
break;
case'-': Push(OpndStack, opnd2-opnd1);
break;
case'*': Push(OpndStack, opnd2*opnd1);
break;
case'/': Push(OpndStack, opnd2/opnd1);
break;
default:
printf("Invalid operator: %c\n", optr.op);
}
}
如果是这儿的问题,我相信你也知道怎么改了。

--
aka day9981
相似回答