0
点赞
收藏
分享

微信扫一扫

开始学习ACM的博客【2】

代码小姐 2022-01-13 阅读 60

数学基础

前言: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;
}

 

举报

相关推荐

0 条评论