题目描述
勇士菜哭武获得了一把新的武器,武器有特殊的伤害计算方式。武器的伤害计算方式由若干个部分的和组成,用+号连接。每一部分可以是一个整数a,或者是一个公式ndx。其中a表示固定伤害a点;ndx表示掷n个x面骰子,伤害是所有骰子点数的和。总伤害是每一部分伤害的和。
比如2d6+1d70+3,表示掷两个6面骰子和一个70面骰子(不一定实际存在70面骰子,可以理解成1到70当中随机选择一个整数),再加上固定伤害3点。
他正准备挑选一把好武器,需要计算新武器的伤害期望值,想让你帮他计算一下。
输入描述:
输入一个字符串,表示伤害计算公式。字符串长度不超过5000,对于每一个部分,1≤a, n, x≤1000。a,n,x都是整数。
输出描述:
输出一个数,表示伤害的期望值。如果不是整数,小数点后位数保留最少,即最终结果只有可能是整数或者小数点后是.5的形式,如果不是整数,那么保留一位小数。
示例1
输入
1d6+1d70+1d10+6
输出
50.5
题意描述:这题题意很好理解,就是如果两个数之间有“d”,被认为是多个筛子,投出多少 就是多少,如果只有一个数,就代表那个数的大小。最后用筛子大小的期望来求 和。其实就是用筛子的平均点数来求和。
解题思路:这题的关键在于字符串中数字的提取。我是将d前面的提取为n,d后面的提取 为m,遇到+进行一次累加运算,同时将n和m置为0。重新开始循环,如果没 有d的时候即m为0,单独累加即可。需要注意的是筛子都是偶数面得所以会 有小数的加法。
错误分析:在内循环中少考虑了字符串走到最后的情况,不过没有交,因为答案不会对。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,m,n;
double sum=0;
char str[10000];
scanf("%s",str);
int len=strlen(str);
for(i=0;i<len;i++)
{
n=0;m=0;
for(;str[i]!='d' && str[i]!='+' && i<len;i++)
n=n*10+(str[i]-'0');
if(str[i]=='d')
{
i++;
for(;str[i]!='+' && i<len;i++)
m=m*10+(str[i]-'0');
}
if(m==0) sum+=n;
else sum+=1.0*(m+1)*n/2;
// printf("%d %d %.2f\n",n,m,sum);
}
if(int(sum)<sum) printf("%.1f\n",sum);
else printf("%.0f\n",sum);
return 0;
}