wenbao與模擬表達式計算
阿新 • • 發佈:2018-04-14
ostream class clas 浮點 == using oid pro AC
http://lx.lanqiao.cn/problem.page?gpid=T419
水水水,也就寫了兩三個小時
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 char str[109], b[109]; 5 int a[109], sum = 0, aa = 0, bb = 0, x, y; 6 void xx(){ //處理乘除 7 while(bb && (b[bb-1] == ‘*‘ || b[bb-1] == ‘/‘)){ 8 if(b[bb-1] == ‘*‘) a[aa-2] = a[aa-2]*a[aa-1]; 9 else a[aa-2] = a[aa-2]/a[aa-1]; 10 aa--, bb--; 11 } 12 } 13 int main(){ 14 scanf("%s", str); 15 int len = strlen(str); 16 bool flag = false; 17 for(int i = 0; i <= len; ++i){ 18 if(i == len){ 19 if(flag) a[aa++] = sum, xx(); 20 break; 21 } 22 if(str[i] >= ‘0‘ && str[i] <= ‘9‘){ 23 flag = true, sum = sum*10+str[i]-‘0‘; 24 }else{ 25 if(flag) a[aa++] = sum, xx(), sum = 0; 26 if(str[i] == ‘)‘){ //處理括號 27 int j; 28 for(j = 1; ; ++j) if(b[bb-j] == ‘(‘) break; 29 for(int k = bb-j+1, t = 1; k < bb; ++k, ++t){ 30 if(b[k] == ‘+‘) a[aa-j] += a[aa-j+t]; 31 else a[aa-j] -= a[aa-j+t]; 32 } 33 aa = aa-j+1, bb = bb-j, xx(); 34 }else{ 35 b[bb++] = str[i]; 36 } 37 flag = false; 38 } 39 } 40 for(int i = 0, k = 1; i < bb; ++i, k++){ 41 if(b[i] == ‘+‘) a[0] += a[k]; 42 else a[0] -= a[k]; 43 } 44 printf("%d\n", a[0]); 45 return 0; 46 }
————————————————————————————————————————————————————————————————————————————————————————————————————————
類似的,只不過是求浮點數的,稍微改一改就過了,,,水水水
http://acm.nyist.net/JudgeOnline/problem.php?pid=35
1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 using namespace std; 5 char str[1009], b[1009]; 6 double a[1009], sum; 7 int aa, bb, num; 8 void xx(){ //處理乘除 9 while(bb && (b[bb-1] == ‘*‘ || b[bb-1] == ‘/‘)){ 10 if(b[bb-1] == ‘*‘) a[aa-2] = a[aa-2]*1.0*a[aa-1]; 11 else a[aa-2] = a[aa-2]*1.0/a[aa-1]; 12 aa--, bb--; 13 } 14 } 15 int main(){ 16 int t; 17 scanf("%d", &t); 18 while(t--){ 19 aa = bb = num = 0; 20 sum = 0; 21 scanf("%s", str); 22 int len = strlen(str); 23 bool flag = false, flag2 = false; 24 for(int i = 0; i < len; ++i){ 25 if(i == len-1){ 26 if(flag) a[aa++] = sum, xx(); 27 break; 28 } 29 if(str[i] == ‘*‘ || str[i] == ‘/‘ || str[i] == ‘+‘ || str[i] == ‘-‘ || str[i] == ‘(‘ || str[i] == ‘)‘){ 30 if(flag) a[aa++] = sum, xx(), sum = 0, num = 0; 31 if(str[i] == ‘)‘){ //處理括號 32 int j; 33 for(j = 1; ; ++j) if(b[bb-j] == ‘(‘) break; 34 for(int k = bb-j+1, t = 1; k < bb; ++k, ++t){ 35 if(b[k] == ‘+‘) a[aa-j] += a[aa-j+t]; 36 else a[aa-j] -= a[aa-j+t]; 37 } 38 aa = aa-j+1, bb = bb-j, xx(); 39 }else{ 40 b[bb++] = str[i]; 41 } 42 flag2 = flag = false; 43 }else{ 44 flag = true; 45 if(str[i] == ‘.‘){ 46 flag2 = true; continue; 47 } 48 if(flag2){ 49 double x = (str[i]-‘0‘)*1.0; 50 num++; 51 int num2 = num; 52 while(num2--){ 53 x/=10.0; 54 } 55 sum += x; 56 }else{ 57 sum = sum*10.0+(str[i]-‘0‘)*1.0; 58 } 59 } 60 } 61 for(int i = 0, k = 1; i < bb; ++i, k++){ 62 if(b[i] == ‘+‘) a[0] += a[k]; 63 else a[0] -= a[k]; 64 } 65 printf("%.2lf\n", a[0]); 66 } 67 return 0; 68 }
只有不斷學習才能進步!
wenbao與模擬表達式計算