算法基本知识
memset()函数:memset(数组名,1/0/-1,sizeof(a)),重置为1是数组为任意正数
求一个数的位数:(int)log10(n)+1,公式log10(i),i 必须为double类型
例题
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[300],b[300];
int i;
while(gets(a))
{
if(strcmp(a,"STARE")==0)
memset(b,0,sizeof(b));
else if(strcmp(a,"END")==0)
printf("%s\n",b);
else if(strcmp(a,"ENDOFINPUT")==0)
break;
else
{
for(i=0; a[i]!='\0'; i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
if(a[i]+21>90)//加密方式给定 可以简单处理
b[i]=a[i]-5;
else
b[i]=a[i]+21;
}
else
b[i]=a[i];
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
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}};
//由末尾数字与自身相乘可到到相乘的规律
while(n--)
{
long long int m;
scanf("%ld",&m);
int d=m%10;
if(d==0||d==1||d==5||d==6)
printf("%d\n",d);
else if(d==4||d==9)
printf("%d\n",a[d][m%2]);
else if(d==2||d==3||d==7||d==8)
printf("%d\n",a[d][m%4]);
}
return 0;
}
//另一种更加直接的方法是使用快速幂
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int n;
while(cin>>n)
{
double res=0;
for(long long int i=1; i<=n; i++)
res=res+log10(i);//推出数学公式
printf("%ld\n",(long long int)res+1);
}
return 0;
}
最左边的数
此题同样需要推数学公式,直接暴力时间太长且数据太大无法存放,推理过程如下:
1、nn = d.xxx * 10 (k-1),其中k表示nn的位数
2、等式两边取以10为底的对数得么d.xxx = 10(log10(nn)-(k-1))
3、带入k得计算公式k = log10(nn)的整数部分+1 = (int)log10(nn)+1
4、得到d得表达式 (int)(10(log10(nn)-(int)log10(nn))
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
double x=0.0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
x=n*log10(n*1.0);
x=x-(long long)x;
x=(int)pow(10,x);
printf("%ld\n",(long long int)x);
}
return 0;
}