一次TLE发现的代码规范问题

一道水题怎么也过不了,经历了痛苦且漫长的debug后发现竟然是数据类型没统一导致的。


题目: hdu5019

问题代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5;
ll s[N];
ll a,b,k;
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
int main() {
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>a>>b>>k;
        ll d=gcd(a,b);
        int cnt=0,i;
        for(i=1;i*i<d;i++)
        {
            if(d%i==0)
            {
                s[++cnt]=i;
                s[++cnt]=d/i;
            }
        }
        if(i*i==d)
            s[++cnt]=i;
        if(cnt<k)
        {
            cout<<-1<<'\n';
        }
        else
        {
            sort(s+1,s+cnt+1);
            cout<<s[cnt+1-k]<<'\n';
        }
    }
    return 0;
}

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5;
ll s[N];
ll a,b,k;
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
int main() {
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>a>>b>>k;
        ll d=gcd(a,b);
        ll cnt=0,i;
        for(i=1;i*i<d;i++)
        {
            if(d%i==0)
            {
                s[++cnt]=i;
                s[++cnt]=d/i;
            }
        }
        if(i*i==d)
            s[++cnt]=i;
        if(cnt<k)
        {
            cout<<-1<<'\n';
        }
        else
        {
            sort(s+1,s+cnt+1);
            cout<<s[cnt+1-k]<<'\n';
        }
    }
    return 0;
}

唯一的不同的是cnti的数据类型,我感觉是在for循环的判定条件中有i*i<dd是long long类型的,左边i也得是long long类型的才能快速判断,不然可能会在每次判断时都进行类型转换,造成大量时间的浪费。

一次TLE,发现了个很深的代码习惯问题。


img_show