C语言算法,签到问题。C++的标程有了,求个C语言的。附带注释,清楚点。

2025-06-21 02:10:29
推荐回答(1个)
回答1:

有多组数据,暂且以输入负数结束输入:代码如下

#include
using namespace std;
//连续签到越长,分数越高,求最少的签到天数,适合贪心算法,多次连续签到
//每次连续签到中未签到一天,则未签到天数最少
void calculator(int score)
{
    int signed_day = 0;    //签到天数
    int unsigned_day = 0;    //未签到天数
    int tmp = 0;        //模拟签到积分统计
    int continued_day = 0;    //单次连续签到天数
    while (true) //多次连续签到,每次中间停签一天
    {
        while (tmp < score) 
        {
            continued_day++;
            tmp += continued_day;
        }//单次连续签到,超过总积分即可后停止,要么刚好,要么多签到一天,下面处理
        if (tmp == score)
        {
            signed_day += continued_day;
            break;
        }//单次连续签到后,如果签到积分刚好等于总积分,则就是少签到天数
        else
        {
            tmp -= continued_day; //先减去多签到的那一天得到的积分
            signed_day += (continued_day - 1); //加上单次连续签到的天数
            unsigned_day++;   //停止签到一天
            continued_day = 0;  //置连续签到天数为0
         }//单次连续签到后,超出总积分
    }
    cout << signed_day << " " << unsigned_day << endl;
}
int main()
{
    int score = 0;
    while (true)
    {
        cin >> score;
        if (score < 0)
            break;
        calculator(score);
    }
    return 0; 
}