伤害计算 (字符串提取)

题目描述

勇士菜哭武获得了一把新的武器,武器有特殊的伤害计算方式。武器的伤害计算方式由若干个部分的和组成,用+号连接。每一部分可以是一个整数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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44584292/article/details/106039161