挑战程序设计竞赛 算法和数据结构 第18章 数论

挑战程序设计竞赛 算法和数据结构 第18章 数论

18.1 质数检验

ALDS1_1_C: Prime Numbers

原书AC代码:

//ALDS1_1_C: Prime Numbers
//C
#include <stdio.h>
/*质数检验*/
int isPrime(int x){
    int i;
    if(x<2)return 0;
    else if(x==2)return 1;/*2是质数*/
    if(x%2==0)return 0;/*偶数不是质数*/
    for(i=3;i*i<=x;i+=2){/*i小于等于x的平方根时*/
        if(x%i==0)return 0;
    }
    return 1;
}
int main(){
    int n,x,i;
    int cnt=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&x);
        if(isPrime(x))cnt++;
    }
    printf("%d\n",cnt);
    return 0;
}


仿照上述代码,本人编写的C语言AC代码如下:

//ALDS1_1_C: Prime Numbers
//C
//2017-10-15 20:28 AC
#include <stdio.h>
int isPrime(int x){//0非质数 1质数
    int i;
    if(x<2)return 0;
    else if(x==2)return 1;
    if(x%2==0)return 0;
    for(i=3;i*i<=x;i+=2)//+2速度又快了很多
        if(x%i==0)
            return 0;
    return 1;
}
int main(){
    int i,n,cnt=0,x;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&x);
        if(isPrime(x))cnt++;
    }
    printf("%d\n",cnt);
    return 0;
}




18.2 最大公约数

ALDS1_1_B: Greatest Common Divisor

原书AC代码:

//ALDS1_1_B: Greatest Common Divisor
//C
#include <stdio.h>
/*用递归函数求最大公约数*/
int gcd(int x,int y){
    return y?gcd(y,x%y):x;
}
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",gcd(a,b));
    return 0;
}


//ALDS1_1_B: Greatest Common Divisor
//C++
#include <iostream>
#include <algorithm>
using namespace std;
//用循环求最大公约数
int gcd(int x,int y){
    int r;
    if(x<y)swap(x,y);//保证y<x
    while(y>0){
        r=x%y;
        x=y;
        y=r;
    }
    return x;
}
int main(){
    int a,b;
    cin>>a>>b;
    cout<<gcd(a,b)<<endl;
    return 0;
}


十分熟悉最大公约数算法,即欧几里德算法,未仿照上述代码,本人编写的C语言AC代码如下:

//ALDS1_1_B: Greatest Common Divisor
//2017-10-15 16:49 AC
#include <stdio.h>
int gcd(int a,int b){//要求a>=b
    if(a%b==0)
        return b;
    return gcd(b,a%b);//此处写成  gcd(b,a%b); 有失水准
}
int main(){
    int x,y,z;
    scanf("%d%d",&x,&y);
    if(x>y)z=gcd(x,y);
    else z=gcd(y,x);
    printf("%d\n",z);
    return 0;
}

18.3 幂乘

NTL_1_B: Power

原书AC代码:

//NTL_1_B Power
//C++
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long llong;
typedef unsigned long long ullong;
llong mod_pow(ullong x,ullong n,ullong mod){
    ullong res=1;
    while(n>0){
        if(n&1)res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}
int main(void){
    ullong m,n;
    cin>>m>>n;
    cout<<mod_pow(m,n,1000000007)<<endl;
    return 0;
}


翻看了以前的编码http://blog.csdn.net/mrcrack/article/details/61625530

P1226 取余运算||快速幂

未仿照上述代码,本人编写的C语言AC代码如下:

//NTL_1_B Power
//2017-10-15 19:41 AC
#include <stdio.h>
#define mod 1000000007
int main(){
    long long m,n,ans=1;
    scanf("%lld%lld",&m,&n);
    while(n){
        if(n&1)//奇数
            ans=(ans*m)%mod;
        m=(m*m)%mod;
        n>>=1;//n=n/2;
    }
    printf("%lld\n",ans);
}


2017-10-15 20:30 AC 该章节内容


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值