簡單計算
題目描述小賽所在的小組主要負責WEB應用的開發工作,這次他所在的小組正在開發一個WEB版的財務軟件。爲方便用戶使用,他
們打算爲用戶提供一個簡單計算功能,用戶輸入數學算式,就可以得到計算結果。其中涉及的計算包括:”+”、”-”、
”*”、”/”、”^”、”(”、”)”,分別表示加減乘除和指數,其中括號用於調整計算的順序。合法的表達式如下:
x+y+z
x+(y+z)
x*(y+z)+a-b-c^d
小賽對此不太精通,因此請你幫忙編寫這個程序。
輸入
輸入數據有多行,每行爲一個用戶輸入的算式,保證算式是合法的,每行最多包含不超過200個字符。所有參與運算的數值均爲整數,若爲指數,則爲正整數。 |
樣例輸入
1+2+3+4+5+6+7+8+9+10 |
輸出
對每個算式,在單獨的一行中輸出計算結果,結果請輸出整數。 |
樣例輸出
55 11 70 |
時間限制C/C++語言:1000MS其它語言:3000MS
|
內存限制C/C++語言:65536KB其它語言:589824KB
|
C語言程序實現如下:
#include <stdio.h>
#include <stdlib.h>
int compare(char a,char b)
//a爲當前的符號,b爲棧裏面的符號;
{
if(a=='('||b=='('||(a=='^'&&b!='^')||((a=='*'||a=='/')&&(b=='+'||b=='-')))
return 1;
else
return 0;
}
int cifang(int a,int b)
{
int temp=1,i;
for(i=0;i<b;i++)
{
temp=temp*a;
}
return temp;
}
int calculation(char c,int a,int b)
{
int temp=0;
switch(c){
case '+':temp=a+b;break;
case '-':temp=a-b;break;
case '*':temp=a*b;break;
case '/':temp=a/b;break;
case '^':temp=cifang(a,b);break;
}
return temp;
}
int calculat(char a[])
{
int temp=0;
int number[50];
char ch[50];
int i=0,j1=0,j2=0;
while(a[i]!='\0')
{
int flag=0;
while(a[i]>='0'&&a[i]<='9'&&a[i]!='\0')
{
temp=temp*10+(a[i]-'0');
i++;
flag=1;
}
if(flag)
{
number[j1]=temp;
temp=0;
j1++;
}
if(a[i]!='\0')
{
if(j2==0)
{
ch[j2]=a[i];
j2++;
}
else if(a[i]!=')')
{
if(compare(a[i],ch[j2-1])==0)
{
number[j1-2]=calculation(ch[j2-1],number[j1-2],number[j1-1]);
j1=j1-1;
j2=j2-1;
}
ch[j2]=a[i];
j2++;
}
else if(a[i]==')')
{
while(ch[j2-1]!='(')
{
number[j1-2]=calculation(ch[j2-1],number[j1-2],number[j1-1]);
j1=j1-1;
j2=j2-1;
}
j2=j2-1;
}
i++;
}
}
while((j2-1)>=0)
{
number[j1-2]=calculation(ch[j2-1],number[j1-2],number[j1-1]);
j1=j1-1;
j2=j2-1;
}
return number[j1-1];
}
int main()
{
char a[200];
int k1,k2;
while(gets(a))
{
if(a[0]!='\0')
printf("%d\n",calculat(a));
}
return 0;
}
以上代碼可能存在一些冗餘的部分,沒有進行修改,如果需要可以自行拷貝和修改。