题目链接:UVa 537 - Artificial Intelligence?
字符串处理,简单题。注意几个函数:
1、strncpy,如果没有把源串全部复制完,需要手动补‘\0’。还有这个函数可以通过源串的指针确定从哪开始复制,这点刚开始没有想到。
2、atof 字符串转化为浮点数,头文件,stdlib.h。
#include <iostream> #include <cstring> #include <stdio.h> #include <stdlib.h> #include <iomanip> using namespace std; const int MAX_N = 1024 * 2; char line[MAX_N]; char a[2][MAX_N / 2]; int T; double _a[2]; int cnt; char b[2]; int solve(int i,int len) { int j; if(line[i - 1] == 'U') { b[cnt] = 'U'; for(j = i + 1;j < len;j++) { if(line[j] == 'V') break; } if(line[j - 1] == 'm') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] / 1000.00; } else if(line[j - 1] == 'k') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] * 1000.00; } else if(line[j - 1] == 'M') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] * 1000000.00; } else { strncpy(a[cnt],line + i + 1,j - i); a[cnt][j - i] = '\0'; _a[cnt] = atof(a[cnt]); } } else if(line[i - 1] == 'P') { b[cnt] = 'P'; for(j = i + 1;j < len;j++) { if(line[j] == 'W') break; } if(line[j - 1] == 'm') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] / 1000.00; } else if(line[j - 1] == 'k') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] * 1000.00; } else if(line[j - 1] == 'M') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] * 1000000.00; } else { strncpy(a[cnt],line + i + 1,j - i); a[cnt][j - i] = '\0'; _a[cnt] = atof(a[cnt]); } } else if(line[i - 1] == 'I') { b[cnt] = 'I'; for(j = i + 1;j < len;j++) { if(line[j] == 'A') break; } if(line[j - 1] == 'm') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] / 1000.00; } else if(line[j - 1] == 'k') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] * 1000.00; } else if(line[j - 1] == 'M') { strncpy(a[cnt],line + i + 1,j - i - 1); a[cnt][j - i - 1] = '\0'; _a[cnt] = atof(a[cnt]); _a[cnt] = _a[cnt] * 1000000.00; } else { strncpy(a[cnt],line + i + 1,j - i); a[cnt][j - i] = '\0'; _a[cnt] = atof(a[cnt]); } } cnt++; return j; } int main() { cin>>T; int num = 0; double result; while(T--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); cnt = 0; getchar(); gets(line); int len = strlen(line); int num1,num2; num1 = num2 = 0; int i; for(i = 0;i < len;i++) { if(line[i] == '=') { i = solve(i,len); } } cout<<"Problem #"<<++num<<endl; if(b[0] == 'P') { if(b[1] == 'U') { result = _a[0] / _a[1]; cout<<"I="; cout<<fixed<<setprecision(2)<<result; cout<<"A"<<endl; } else { result = _a[0] / _a[1]; cout<<"U="; cout<<fixed<<setprecision(2)<<result; cout<<"V"<<endl; } } else if(b[0] == 'U') { if(b[1] == 'P') { result = _a[1] / _a[0]; cout<<"I="; cout<<fixed<<setprecision(2)<<result; cout<<"A"<<endl; } else { result = _a[0] * _a[1]; cout<<"P="; cout<<fixed<<setprecision(2)<<result; cout<<"W"<<endl; } } else if(b[0] == 'I') { if(b[1] == 'P') { result = _a[1] / _a[0]; cout<<"U="; cout<<fixed<<setprecision(2)<<result; cout<<"V"<<endl; } else { result = _a[0] * _a[1]; cout<<"P="; cout<<fixed<<setprecision(2)<<result; cout<<"W"<<endl; } } cout<<endl; } return 0; }