题意

数学抽象:给定n,初始计数为0,对于n>=2,每次n-=2,计数加1,求最终计数

每次最多10组数据,每个数据不超过100

方法

朴素实现

把数学抽象后的题意转换成代码

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    while(true){
        int n;
        cin>>n;
        if(n==0)break; // 结束标识
        int r = 0; // 计数
        while(n>=2){ // 不小于2
            r++; // 计数+1
            n-=2; // n-=2
        }
        cout<<r<<endl;
    }
    return 0;
}

复杂度分析

设值最大为vvv, 数据组数为nnn

时间复杂度: 我们对于每个数据,进行了O(v)O(v)O(v)的操作,所以总时间复杂度为O(nv)O(nv)O(nv)

空间复杂度: 没有任何数组,只使用了常数大小的空间,所以空间复杂度为O(1)O(1)O(1)

数学

虽然这里的上限只有100,但如果范围更大也会超时。

次数 值/2
0 0 0
1 0 0
2 1 1
3 1 1
4 2 2
5 2 2
6 3 3
7 3 3
8 4 4
8 4 4

通过尝试前面的值,或观察每次减2的运算,不难发现,次数刚好等于整除2,所以这里减去相同的值多次可以用除法代替。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    while(true){
        int n;
        cin>>n;
        if(n==0)break;
        cout<<n/2<<endl; // 直接除以2替代上面的循环
    }
    return 0;
}

复杂度分析

设值最大为vvv, 数据组数为nnn

时间复杂度: 我们对于每个数据,直接除法运算,所以总时间复杂度为O(n)O(n)O(n)

空间复杂度: 没有任何数组,只使用了常数个临时变量,所以空间复杂度为O(1)O(1)O(1)