挑战程序设计竞赛 算法和数据结构 第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;
}
//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 该章节内容