当前位置: 代码迷 >> 综合 >> Financial Management UVA - 11945
  详细解决方案

Financial Management UVA - 11945

热度:65   发布时间:2023-10-13 14:51:49.0

问题类型:字符串,有限状态自动机

03pie’s solution for [UVA-11945]

#include <iostream> #include <cstdio> #include <cstring> using namespace std;  void output_result(char s[], char t[])  {  int len = strlen(s);  int i = len - 1, j=0;  int state = 0, count;  while(i >=0) {  count++;  t[j++] = s[i];  if(s[i] == '.') {  state = 1;  count = 0;  } else if(s[i] == '$')  state = 2;  if(state == 1 && count == 3 && s[i-1] != '$')  t[j++] = ',';  i--;  }  j--;  while(j >= 0)  putchar(t[j--]); //输出到数组t里 }  int main()  {  int t2;  double val, sum;  char s[128], t[128];  cin >> t2;  for(int i=1; i<=t2; i++) {  sum = 0;  for(int j=1; j<=12; j++) {  cin >> val;  sum += val;  }  sprintf(s, "%d $%.2f\n", i, sum / 12); //输出到数字s中,并在其前面加入“i $ ”。 output_result(s, t);  }  return 0;  }  

帮助理解有限状态自动机。

//例如:有限状态自动机:输入串为3进制数,输出为模5的余数(0,1,2,3,4)
//模5的余数总共只有5个,这就是5个状态。初始状态为0,每个状态也都是最终状态。
//三进制每位数有3种可能,因此每种状态有3种跃迁可能。
//把3进制串理解成从高位到低位一个一个输入,每条输入就是一次跃迁,状态就是到当前输入为止的3进制数模5的余数。
//跃迁的函数如下:
//目标状态 = (当前状态 *进制数(此题为3) + 串的当前位)% 5。
//举例如下:
//三进制数 12112
//当前状态 输入 跃迁
//0 1 (0*3+1) % 5 = 1
//1 2 (1*3+2) % 5 = 0
//0 1 (0*3+1) % 5 = 1
//1 1 (1*3+1) % 5 = 4
//4 2 (4*3+2) % 5 = 4 (最终结果) 
#include<iostream> 
#include<cstring>
#include<cstdio>using namespace std;const int maxn=100;
int main(){char a[maxn];while(scanf("%s",a)){int status=0;for(int i=0;i<strlen(a);i++){status=((status*3+(a[i]-'0'))%5);cout<<"status="<<status<<endl;}}return 0;
}
  相关解决方案