Complejidad de tiempo
La complejidad de tiempo se clasifica de menor a mayor.
La complejidad de tiempo final del algoritmo está determinada por la frecuencia de la declaración más interna en la declaración de bucle con los niveles más anidados
cin.getline
istream&getline(char name[],int size,char endchar='\n')
可以实现输入特定长度的字符串,若超过特定长度则只取符合长度的,若不超过可用\n控制结束
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[100];
cin.getline(a,100);
printf("%s",a);
return 0;
}
Festival de bucle
Encuentra el último dígito de n ^ n, encuentra el período regular
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10][4]={{0},{1},{6,2,4,8},{1,3,9,7},{6,4},{5},{6},{1,7,9,3},{6,8,4,2},{1,9}};
long int n,x,y;
while(scanf("%ld",&n)>0)
{
while(n--)
{
scanf("%ld",&x);
y=x%10;
if(y==0||y==1||y==5||y==6)
{
printf("%d\n",y);
}
else if(y==4||y==9)
{
printf("%d\n",a[y][x%2]);
}
else
{
printf("%d\n",a[y][x%4]);
}
}
}
return 0;
}
Exponenciación rápida
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i,n,t;
while(scanf("%d",&n)>0)
{
while(n--)
{
int s=1;
scanf("%d",&t);
for(i=1;i<=t;i++)
s=(s*(t%10))%10;
printf("%d\n",s);
}
}
return 0;
}
Encuentra n! Dígitos
El número de dígitos en un número n se puede expresar por lg (n) +1
#include <bits/stdc++.h>
using namespace std;
int main()
{
long int i,n;
while(scanf("%ld",&n)>0)
{
double sum=0.0;
for(i=2;i<=n;i++)
{
sum=sum+log10(i);
}
printf("%ld\n",(long int)sum+1);
}
return 0;
}
Encuentra el número más a la izquierda de n ^ n
#include <bits/stdc++.h>
using namespace std;
int main()
{
long int n,t;
double x=0.0;
while(scanf("%ld",&n)>0)
{
while(n--)
{
scanf("%ld",&t);
x=t*log10(double(t));
x=x-(long long)x;
x=(int)pow(10,x);
printf("%.0lf\n",x);
}
}
return 0;
}
ordenar
Archivo de encabezado: algoritmo.h
Complejidad: n * log (n)
Orden ascendente: sort (a, a + n, less <data-type> ())
Orden descendente: sort (a, a + n, mayor <data-type> ())
Festival de bucle
nefu-67
#include <bits/stdc++.h>
using namespace std;
int main()
{
int f[101],a,b,n,i;
while(cin>>a>>b>>n)
{
f[1]=1;
f[2]=1;
if(a==0&&b==0&&n==0)
break;
if(n<3)
cout<<"1"<<endl;
else
{
for(i=3;i<=49;i++)//自动找出循环节
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i]==1&&f[i-1]==1)
break;
}
n=n%(i-2);//注意下标
if(n==0)
cout<<f[i-2]<<endl;
else
cout<<f[n]<<endl;
}
}
return 0;
}
nefu-519
f (n) = 1 ^ 2 + 2 ^ 2 +… + n ^ n = (1/6) * n * (n + 1) (2 n + 1)
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,ans,t;
while(cin>>n)
{
t=n*(n+1)/2;//两个连续整数相乘必是一奇一偶,一定可以被二整除
if(t%3==0)
{
t=t/3;
ans=(t%1007)*((n*2+1)%1007);
ans=ans%1007;
}
else//因为最后结果一定是整数,所以如果t不能被三整除那么2*n+1一定可以
{
ans=(2*n+1)/3;
ans=ans%1007;
ans=(t%1007)*ans;
ans=ans%1007;
}
cout<<ans<<endl;
}
return 0;
}
nefu-763
Hay varios ceros al final de n !, porque 2 * 5 = 10, así que encuentra el logaritmo de 2,5, y porque el número de 5 es pequeño, ¡encuentra n! El número de 5.
Ejemplo: 100
100/5 = 20 significa que hay 20 números divisibles antes de
100 100/5/5 = 4 significa que hay 4 números que son divisibles por 25 antes de 100, y 25 se pueden descomponer en dos 5
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,ans;
while(cin>>n)
{
ans=0;
while(n)
{
n=n/5;
ans+=n;
}
cout<<ans<<endl;
}
return 0;
}
nefu-901
#include <bits/stdc++.h>
using namespace std;
int main()
{
double a[100001];
int n;
double s1,s2;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
sort(a,a+n);
while(scanf("%lf %lf",&s1,&s2)>0)
{
int ans=upper_bound(a,a+n,s2)-lower_bound(a,a+n,s1);
printf("%d\n",ans);
}
return 0;
}
¡Los lugares propensos a errores
Int ans = lower_round (a, a + n, x)
están equivocados!
La redacción correcta:
Int ans = lower_round (a, a + n, x) -a;
porque lower_round () devuelve un puntero, no un int
Dicotomía
nefu-899
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,ans,l,r,mid;
while(scanf("%d %d",&n,&k)>0)
{
ans=0;l=1;r=n;
while(l<=r)
{
ans++;
mid=(l+r)/2;
if(mid==k)
break;
if(mid<k)
l=mid+1;
if(mid>k)
r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}