数学基础
前言:int(-2147483648~+2147483647)
在写程序时,需要注意数据的范围。如:使用高斯公式时(n*(n+1)/2)当n=50000时,最终结果不会超过int的范围,但计算n*(n+1)时会超过,使得结果出错。
此时,可以使用long long,也可以先对n和n+1进行奇偶的判断,再将其中为偶数的一项先除以2,使数据大小不会超出int的范围。
最小公倍数
法一
枚举
用两数中较大的一个数进行倍数枚举,并判断是否为另一个数的倍数,以此寻找最小公倍数。
法二
数学方法
最小公倍数LCM(a,b)=a*b/最大公约数GCD(a,b)
使用公式时要注意a*b会不会超过int的范围,故建议写成 a/GCD(a,b)*b
问题变为求最大公约数GCD
欧几里得算法
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
int gcd(int big,int small)
{
int temp;
while(small!=0)
{
temp=big%small;
big=small;
small=temp;
}
return big;
}
//注意,这个代码中输入时大小数据颠倒不会出错(经过一个循环后会被更正)
最终代码
#include<stdio.h>
int gcd(int big,int small);
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)==2)
{
int lcm;
lcm=a/gcd(a,b)*b;
printf("%d\n",lcm);
}
return 0;
}
int gcd(int big,int small)
{
int temp;
while(small!=0)
{
temp=big%small;
big=small;
small=temp;
}
return big;
}
计算N的N次幂的个位数
法一
直接计算N*N数据太大,要每乘一次N就取一次个位。(如果N的数据特别大,如本题中,则会超时)
法二
先取出N的个位数,再找出其的循环节(循环节的长度一定不超过5个数(奇\偶)),再求即可。
#include<stdio.h>
int gewei(int n);
int MyPow(int a,int b);
int main()
{
int num;
scanf("%d",&num);
for(int i=0;i<num;i++)
{
int n;
int a;
int cycle[5]={0};//创建个位的循环数组
int sn=1;//有效的循环个数
scanf("%d",&n);
a=gewei(n);
cycle[0]=a;
for(int j=1;j<5;j++)
{
cycle[j]=gewei(MyPow(a,j+1));
if(cycle[0]==cycle[j])
{
sn=j;
break;
}
}
int x;//判断是否取循环节中的哪一位
if(n%sn==0)
{
x=sn-1;
}
else
{
x=n%sn-1;
}
printf("%d\n",cycle[x]);
}
return 0;
}
int gewei(int n)//取个位
{
return (n%10);
}
int MyPow(int a,int b)//取整数的次方
{
int final=1;
for(int i=0;i<b;i++)
{
final*=a;
}
return final;
}