为什么这段代码的时间复杂度是O(n)?怎么算的?

图片说明

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; 
int n, ans;
bool ok(int x) {
    int t = 10;
    while (x) {
        int d = x % 10;
        if (d > t) return false;
        t = d;
        x /= 10;
    }
    return true;
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        if (ok(i)) ans++;
     }
    printf("%d", ans);
    return 0;
} 

来源:https://blog.csdn.net/qq_41280600/article/details/105256382?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160277239719195264705696%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160277239719195264705696&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-1-105256382.pc_first_rank_v2_rank_v28&utm_term=%E8%93%9D%E6%A1%A5%E6%9D%AF%E7%AC%AC%E5%8D%81%E4%B8%80%E5%B1%8A%E6%A0%A1%E5%86%85%E6%A8%A1%E6%8B%9F&spm=1018.2118.3001.4187

ok的复杂度是 LogN
但是近似可以认为是常数,原因是x被调用是连续的,无论n是多少,某一个位数的x都占了大头
而主程序是N
所以最后就是N

Main函数的时间复杂度是O(n)这个没有问题
OK函数的时间复杂度应该是 log(N)
整体的时间复杂度应该为O( NlogN)