用c语言解决,充值问题

问题描述

zpt最近喜欢玩游戏。
有些游戏是要充值点卡的,所以他准备疯狂地购买。
但是,他去充值点买的时候,发现老板是一个怪人,他会将一张面额为N的点卡在销售的时候随机确定价格,价格在(1~N)之间。
更奇怪的是,xujiestra不喜欢找零钱,最奇怪的却是zpt很懒,不想再回去一次拿零钱。
所以,现在zpt请教你们一个问题,怎么样拿最少张数的钱(我们假设钱的面额可以为任意int范围内正整数),确保可以在老板报出价格时拿出相应的钱出来买下东西。
也就是说你带M张的钱,可以拼凑出1~N范围内的所有面额。

输入

输入有多组,直到文件结束。
每一组有一个int范围内的整数N。

输出

输出zpt需要携带满足所有情况的最少张数M。

输入样列

1
2
3
4

输出样例

1
2
2
3

提示

数据1:面额为1元,他只需要带一张1元的就可以了。
数据2:面额为2元,他可以选择带一张1元的和一张2元的,当xujiestra说1元的时候给1元,2元给2元。 也可以带面值分别为1,1两张。
数据3:面额为3元,他可以选择带面值为1,2的钱,当面额分别为1,2时给他相应的钱,是3元的时候给3元(1元+2元 两张)。
数据4:面额为4元,他可以选择带面值为1,1,2 。这三张可以拼凑出1~4的所有面值。同时也带1,1,3 也可符合条件。(最少是三张)

我的代码

#include <stdio.h>
int main(){
    int t,n;
    while(scanf("%d",&n)!=EOF){
        t=1;
        while(t*(t+1)/2<n){
            t++;
        }
        printf("%d\n",t);
    }
    return 0;
}

为啥老是TLE超出时间

t*(t+1)的结果可能会超出int类型范围,
t改成long long为类型试试

正解:利用二进制思想已完成

#include <stdio.h>
int main(){
    int n;while(scanf("%d",&n)!=EOF){
        int cnt=0;
        while(n){
            cnt++;n/=2;
        }
        printf("%d\n",cnt);
    } 
    return 0;
}
#include <stdio.h>
int main() {
    int t,n;
     do{
        t=1;
        while(t*(t+1)/2<n) {
            t++;
        }
        printf("%d\n",t);
    }while(scanf("%d",&n)!=EOF)
    return 0;
}

试试这个