《算法笔记》第五章源代码

P153

#include
#include
using namespace std;
bool cmp(int a, int b){
	return a > b;
}
void to_array(int n, int num[]){
	for(int i = 0; i < 4; i++){
		num[i] = n % 10;
		n /= 10;
	}
}
int to_number(int num[]){
	int sum = 0;
	for(int i = 0; i < 4; i++){
		sum = sum * 10 + num[i];
	}
	return sum;
}
int main(){
	int n, MIN, MAX;
	scanf("%d",&n);
	int num[5];
	while(1){
		to_array(n, num);
		sort(num, num + 4);
		MIN = to_number(num);
		sort(num, num + 4, cmp);
		MAX = to_number(num);
		n = MAX - MIN;
		printf("%04d - %04d = %04d\n", MAX, MIN, n);
		if(n == 0 || n == 6174){
			break;
		}
	}
	return 0;
}

P155~156

#include
int gcd(int a,int b){
   if(b==0){
   	return a;
   }else{
   	return gcd(b,a%b);
   }
}

int main(){
   int m,n;
   while(scanf("%d%d",&m,&n)!=EOF){
   	printf("%d\n",gcd(m,n));
   }
   return 0;
}

P157~159

#include
#include
const int maxn=100010;
bool isprime(int n){
   if(n<=1){
   	return false;
   }
   int sqr=(int)sqrt(1.0*n);
   for(int i=2;i<=sqr;i++){
   	if(n%i==0){
   		return false;
   	}
   }
   return true;
}
int prime[maxn],pnum=0;
void find_prime(){
   for(int i=1;i<maxn;i++){
   	if(isprime(i)){
   		prime[pnum++]=i;
   	}
   }
}
struct factor{
   int x,cnt;
}fac[10];
int main(){
   find_prime();
   int n,num=0;
   scanf("%d",&n);
   if(n==1){
   	printf("1=1");
   }else{
   	printf("%d=",n);
   	int sqr=(int)sqrt(1.0*n);
   	for(int i=0;i<pnum&&prime[i]<=sqr;i++){
   		if(n%prime[i]==0){
   			fac[num].x=prime[i];
   			fac[num].cnt=0;
   			while(n%prime[i]==0){
   				fac[num].cnt++;
   				n/=prime[i];
   			}
   			num++;
   		}
   		if(n==1){
   			break;
   		}
   	}
   	if(n!=1){
   		fac[num].x=n;
   		fac[num++].cnt=1;
   	}
   	for(int i=0;i<num;i++){
   		if(i>0){
   			printf("*");
   		}
   		printf("%d",fac[i].x);
   		if(fac[i].cnt>1){
   			printf("^%d",fac[i].cnt);
   		}
   	}
   }
   return 0;
}

P161

#include
#include
bool isprime(int n){
   if(n<=1){
   	return false;
   }
   int sqr=(int)sqrt(1.0*n);
   for(int i=2;i<=sqr;i++){
   	if(n%i==0){
   		return false;
   	}
   }
   return true;
}
int prime[101],pnum=0;
bool p[101]={0};
void find_prime(){
   for(int i=1;i<101;i++){
   	if(isprime(i)){
   		prime[pnum++]=i;
   		p[i]=true;
   	}
   }
}
int main(){
   find_prime();
   for(int i=1;i<pnum;i++){
   	printf("%d ",prime[i]);
   }
   
   return 0;
}

P163

#include
#include
int prime[101],pnum=0;//primr数组存放所以素数,pNum为素数个数
bool p[101]={0};//如果i为素数 则p[i] == false 
void find_prime(){
   for(int i=2;i<101;i++){
   	if(p[i]==false){
   		prime[pnum++]=i;
   		for(int j=i+i;j<101;j+=i){
   			p[j]=true;
   		}
   	}
   }
}
int main(){
   find_prime();
   for(int i=1;i<pnum;i++){
   	printf("%d ",prime[i]);
   }
   
   return 0;
}

P164

#include
#include
const int maxn=1000001;
int prime[maxn],pnum=0;
bool p[maxn]={0};
void find_prime(int n){
   for(int i=2;i<maxn;i++){
   	if(p[i]==false){
   		prime[pnum++]=i;
   		if(pnum>=n){
   			break;
   		}
   		for(int j=i+i;j<maxn;j+=i){
   			p[j]=true;
   		}
   	}
   }
}
int main(){
   int m,n,count=0;
   scanf("%d%d",&m,&n);
   find_prime(n);
   for(int i=m;i<=n;i++){
   	printf("%d",prime[i-1]);
   	count++;
   	if(count%10!=0&&i<n){
   		printf(" ");
   	}else{
   		printf("\n");
   	}
   }
   
   return 0;
}

P168~169

#include
#include
const int maxn=100010;
bool isprime(int n){
   if(n<=1){
   	return false;
   }
   int sqr=(int)sqrt(1.0*n);
   for(int i=2;i<=sqr;i++){
   	if(n%i==0){
   		return false;
   	}
   }
   return true;
}
int prime[maxn],pnum=0;
void find_prime(){
   for(int i=1;i<maxn;i++){
   	if(isprime(i)){
   		prime[pnum++]=i;
   	}
   }
}
struct factor{
   int x,cnt;
}fac[10];
int main(){
   find_prime();
   int n,num=0;
   scanf("%d",&n);
   if(n==1){
   	printf("1=1");
   }else{
   	printf("%d=",n);
   	int sqr=(int)sqrt(1.0*n);
   	for(int i=0;i<pnum&&prime[i]<=sqr;i++){
   		if(n%prime[i]==0){
   			fac[num].x=prime[i];
   			fac[num].cnt=0;
   			while(n%prime[i]==0){
   				fac[num].cnt++;
   				n/=prime[i];
   			}
   			num++;
   		}
   		if(n==1){
   			break;
   		}
   	}
   	if(n!=1){
   		fac[num].x=n;
   		fac[num++].cnt=1;
   	}
   	for(int i=0;i<num;i++){
   		if(i>0){
   			printf("*");
   		}
   		printf("%d",fac[i].x);
   		if(fac[i].cnt>1){
   			printf("^%d",fac[i].cnt);
   		}
   	}
   }
   return 0;
}

P170~176

#include
//法一:递归式
int res1[1010][1010]={0};
int c1(int n,int m,int p){
   if(m==0||m==n){
   	return 1;
   }
   if(res1[n][m]!=0){
   	return res1[n][m];
   }else{
   	return res1[n][m]=(c1(n-1,m,p)+c1(n-1,m-1,p))%p;
   }
}
//法一:递推式
int res2[1010][1010]={0};
const int t=10;//t相当于n
void c2(){
   for(int i=0;i<=t;i++){
   	res2[i][0]=res2[i][i]=1;
   }
   for(int i=2;i<=t;i++){
   	for(int j=0;j<=i/2;j++){
   		res2[i][j]=(res2[i-1][j]+res2[i-1][j-1])%100;//此处的10相当于p
   		res2[i][i-j]=res2[i][j];
   	}
   }
}
//法二:定义式计算

int main(){
   printf("%d",res2[5][2]);
   return 0;
}

P181~183

#include
//法一:递归式
int res1[1010][1010]={0};
int c1(int n,int m,int p){
   if(m==0||m==n){
   	return 1;
   }
   if(res1[n][m]!=0){
   	return res1[n][m];
   }else{
   	return res1[n][m]=(c1(n-1,m,p)+c1(n-1,m-1,p))%p;
   }
}
//法一:递推式
int res2[1010][1010]={0};
const int t=10;//t相当于n
void c2(){
   for(int i=0;i<=t;i++){
   	res2[i][0]=res2[i][i]=1;
   }
   for(int i=2;i<=t;i++){
   	for(int j=0;j<=i/2;j++){
   		res2[i][j]=(res2[i-1][j]+res2[i-1][j-1])%100;//此处的10相当于p
   		res2[i][i-j]=res2[i][j];
   	}
   }
}
//法二:定义式计算

int main(){
   printf("%d",res2[5][2]);
   return 0;
}

P183~185

#include
long long c1(long long  n,long long m){//直接利用公式计算
   long long ans=1;
   for(long long i=1;i<=n;i++){
   	ans*=i;
   }
   
   for(long long i=1;i<=m;i++){
   	ans/=i;
   }
   for(long long i=1;i<=n-m;i++){
   	ans/=i;
   }
   return ans;
}
//c(n,m)=c(n-1,m)+c(n-1,m-1)
long long c2(long long n,long long m){//利用递归
   if(m==0||m==n){
   	return 1;
   }else{
   	return c2(n-1,m)+c2(n-1,m-1);
   }
}
long long res3[67][67]={0};
long long c3(long long n,long long m){//记录算过的C(n,m) 递归
   if(m==0||m==n){
   	return 1;
   }
   if(res3[n][m]!=0){
   	return res3[n][m];
   }else{
   	return res3[n][m]=c3(n-1,m)+c3(n-1,m-1);
   }
}
int res4[67][67]={0};
const int t=60;
void c4(){//打表递推
   for(int i=0;i<=t;i++){
   	res4[i][0]=res4[i][i]=1;
   }
   for(int i=2;i<=t;i++){
   	for(int j=0;j<=i/2;j++){
   		res4[i][j]=res4[i-1][j]+res4[i-1][j-1];
   		res4[i][i-j]=res4[i][j];
   	}
   }
}
long long c5(long long n,long long m){//定义式变形
   long long ans=1;
   for(long long i=1;i<=m;i++){
   	ans=ans*(n-m+i)/i;
   }
   return ans;
}
int main(){
   printf("%d",c5(5,2));
   return 0;
}





P186

#include
//法一:递归式
int res1[1010][1010]={0};
int c1(int n,int m,int p){
   if(m==0||m==n){
   	return 1;
   }
   if(res1[n][m]!=0){
   	return res1[n][m];
   }else{
   	return res1[n][m]=(c1(n-1,m,p)+c1(n-1,m-1,p))%p;
   }
}
//法一:递推式
int res2[1010][1010]={0};
const int t=10;//t相当于n
void c2(){
   for(int i=0;i<=t;i++){
   	res2[i][0]=res2[i][i]=1;
   }
   for(int i=2;i<=t;i++){
   	for(int j=0;j<=i/2;j++){
   		res2[i][j]=(res2[i-1][j]+res2[i-1][j-1])%100;//此处的10相当于p
   		res2[i][i-j]=res2[i][j];
   	}
   }
}
//法二:定义式计算

int main(){
   printf("%d",res2[5][2]);
   return 0;
}

你可能感兴趣的:(算法笔记学习,算法,c语言)