Gary's Calculator
Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 18 Accepted Submission(s) : 4
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
For simplicity, you only need to consider two kinds of calculations in your program: addition and multiplication. It is guaranteed that all input numbers to the calculator are non-negative and without leading zeroes.
Input
Input ends with End-of-File.
Output
Sample Input
3 100 + 600 3 20 * 4 2 + 500 5 20 + 300 * 20
Sample Output
Case 1: 700 Case 2: 80 Case 3: Invalid Expression! Case 4: 6020
wa了好多次,终于ac了。。。 wa的原因是少考虑了一种情况。。。
#include<stdio.h>
#include<string.h>
void reverse(char *s) // 倒序
{
int i,j,len;
char temp;
len=strlen(s);
for(i=0,j=len-1;i<j;j--,i++){
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
void mult(char *p1,char *p2) // 字符串相乘
{
int i,j,a,b;
int num1[200],num2[200],result[200];
a = strlen(p1);
b = strlen(p2);
for(i=0; i<a; i++)
num1[i] = p1[a-i-1] - '0';
for(i=0; i<b; i++)
num2[i] = p2[b-i-1] - '0';
memset(result, 0, sizeof(result));
for(i=0; i<a; i++)
{
for(j=0; j<b; ++j)
{
result[i+j] += num1[i] * num2[j];
if(result[i+j] >= 10)
{
result[i+j+1] += result[i+j] / 10;
result[i+j] %= 10;
}
}
}
memset(p1,0,sizeof(p1));
for(i=(a+b-1);i>=0;i--){
p1[a+b-1-i]=result[i]+'0';
}
}
void add(char *s1,char *s2) // 字符串相加
{
int i,l,len1,len2,c;
len1=strlen(s1);
len2=strlen(s2);
reverse(s1);
reverse(s2);
l=len1>len2?len1:len2;
for(i=0,c=0;i<l||c;i++ ){
if( i<len1)
c+=s1[i]-'0';
if( i<len2 )
c+=s2[i]-'0';
s1[i]=c%10+'0';
c/=10;
}
reverse(s1);
}
int main()
{
char a[20][200];
int len,n,i,j,k,h,m,g,c=0,flag,t,f;
char s[20][20],op[20][20];
while(scanf("%d",&n)!=EOF){
flag=1; g=1;
for(i=0;i<n;i++){ // 输入并判断是否合法
scanf("%s",s[i]);
if(i%2==0 && (strcmp(s[i],"+")==0 || strcmp(s[i],"*")==0)) flag=0;
if(i%2==1 && (strcmp(s[i],"+")!=0 && strcmp(s[i],"*")!=0)) flag=0; // 少考虑了
}
printf("Case %d: ",++c);
if(n%2==0) flag=0;
if(flag && g){
k=0; h=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++){
if(strcmp(s[i],"+")&&strcmp(s[i],"*")){
for(m=0;m<strlen(s[i]);++m){ // 判断字符是不是数字
if(s[i][m]<'0' || s[i][m]>'9')
g=0;
}
strcpy(a[k++],s[i]);
if(h&&strcmp(op[h-1],"*")==0){
mult(a[k-2],a[k-1]);
h--; k--;
}
}
else{
strcpy(op[h],s[i]);
h++;
}
}
while(h){
add(a[k-2],a[k-1]);
k--; h--;
}
}
if(flag && g){
f=1;
for(i=0;i<strlen(a[0]);i++){ // 消除前导的0
if(a[0][i]!='0'){ f=0; break; }
}
if(f) printf("0\n");
else{
for(j=i;j<strlen(a[0]);j++)
printf("%c",a[0][j]);
printf("\n");
}
}
else printf("Invalid Expression!\n");
}
system("pause");
return 0;
}