用C++完成一个简单的小程序

题目描述:
假定一款游戏中,有A,B两角色单挑对决。每次A先攻击B,造成A具有的攻击力的伤害值。然后B攻击A,同样,造成B具有的攻击力的伤害值。重复这一过程,直到有一方血量降为0或以下。如果A能打赢B,则输出获胜后A的血量,否则输出0。
输入:
第一行为A的血量和攻击力值
第二行为B的血量和攻击力值
输出:
输出仅一行,表示A剩下的血量,若A被打死则为0
样例输入:
100 9
100 8
样例输出:
12

#include <iostream>

int main () {
    int aHealth, aHit;
    int bHealth, bHit;
    cin >>aHealth >> aHit >> bHealth >> bHit
    while(true) {
        bHealth -= aHit;
        if (bHealth <= 0) {
             break;
        }
        aHealth -= bHit;
        if(aHealth <= 0) {
             break;
        }
      }
      cout << (aHealth > 0 ? aHealth : 0);
}

这是一个O(1)的解法:


#include <iostream>
#define DEBUG
using namespace std;

int main(void)
{
    // A的血量 A的攻击力值 B的血量 B的攻击力值
    int a, b, c, d;
    cin >> a >> b >> c >> d;

    // (a / d) 为A最多受B的伤害次数
    // (c / b) 为B最多受A的伤害次数
    // 如果前者大于等于后者,A先攻击B, A可以战胜后者
    if ((a / d) >= (c / b))
    {
        // 最后剩余血量就等于(A的初始血量 - B最多打掉A的血量)
        cout << a - ((c / b) * d) << endl;
    }
    else    // A不能战胜后者
        cout << 0 << endl;
    return 0;
}

关于比较血量的解释:
只能说是歪打正着了,虽然计算伤害次数会忽略掉剩余的残血,导致按这个次数算下来A,B双方最后可能都还有血量。不过由于A先手,所以A可以一击打败B,B血量降到0或0以下,无法反击。所以最终B对A造成的伤害次数仍然是B最多整数承伤次数(B的血量整除下取整A的攻击值)。

望采纳,谢谢!

其实答案差不多。楼上的就很好了

#include <iostream>
using namespace std;
int main(){
    int aHealth, aHit;
        int bHealth, bHit;
        cin >>aHealth >> aHit >> bHealth >> bHit;
    do{
        
        bHealth -= aHit;
        if(bHealth <= 0) break;
        aHealth -= bHit;
        if(aHealth <= 0) break;
    }while(aHealth > 0 && bHealth > 0);
    cout << (aHealth > 0 ? aHealth : 0);
    return 0;
}

#include<iostream>
using namespace std;
int min(int a, int b) { return a < b ? a : b; }
int main() {
    int aHealth=0, aHit=0, bHealth=0, bHit=0;
    cin>> aHealth >> aHit>>bHealth>> bHit;
    int aTime, bTime;
    aTime = aHealth / bHit;//a存活时间
    bTime = bHealth / aHit;//b存活时间
    int together = min(aTime, bTime);
    int aRemain = aHealth - together * bHit,//剩余血
        bRemain = bHealth - together * aHit;
    if (aRemain == 0 && bRemain == 0) {//经过同次数时,都减为0
        cout << aRemain + bHit << endl;
    }
    else if (aRemain == 0) {
        cout << 0 << endl;
    }
    else if (bRemain == 0) {
        cout << aRemain << endl;
    }
    else{
        bRemain -= aHit;
        if (bRemain <= 0) {
            cout << aRemain << endl;
            return 0;
        }
        aRemain -= bHit;
        if (aRemain <= 0) {
            cout << 0 << endl;
            return 0;
        }
    }
}