伤害计算 (字符串提取)

题目描述

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BayMin0520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值