《算法笔记》练习(五)

PAT 1031B 数素数

令 P​i​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10​4,请输出 P​M到 PN的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 P​M到 P​N的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
//判断是否为素数
bool isPrime(int number){
	for(int i = 2;i<=sqrt(number);i++){
		if(number%i == 0){
			return false;
		}
	}
	return true;
} 

int main(){
	int m,n,k,number;
	cin>>m>>n;
	k = 0;
	number = 2;
	while(k<=n){
		if(isPrime(number)){
			k++;
			if(k>=m && k<=n){
				if((k-m+1)%10 != 1){
					cout<<" ";
				}
				cout<<number;
				if((k-m+1)%10 == 0){
					cout<<endl;
				}
			}
		}
		number++;
	}
	return 0;
} 

PAT1059A Prime Factors

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1​k​1×p​2​k​2×⋯×p​m​​ ​k​m
Input Specification:
Each input file contains one test case which gives a positive integer N in the range of long int.
Output Specification:
Factor N in the format N = N = p​1​​ k1*p​2k​2*…pm^km
​​ , where p​ i’s are prime factors of N in increasing order, and the exponent k​i​is the number of p​i-- hence when there is only on p​i, k​i is 1 and must NOT be printed out.
Sample Input:
97532468
Sample Output:
97532468=2^2
1117101*1291

关于质因数:https://baike.baidu.com/item/质因数/6192269?fr=aladdin

#include<cstdio>
#include<iostream>
#include<cmath> 
/*
*生成素数数组
*得出素数表 
* 对输入内容进行取余 
*/
using namespace std;
const int maxn = 100010;
//判断是否为素数
bool isPrime(int n){
	if(n == 1) return false;
	int rs = (int)sqrt(n*1.0);
	for(int i = 2;i<=rs;i++){
		if(n%i == 0){
			return false;
		}
	} 
	return true;
} 
int prime[maxn],pNum=0;
//求素数表
void getPrime(){
	for(int n =1;n<maxn;n++){
		if(isPrime(n) == true){
			prime[pNum++] = n;
		}
	}
} 
//创建结构体,存放素数和该素数的个数
struct factor{
	int x,cnt;
}fac[10]; 
int main(){
	getPrime();
	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;
}

大整数尝试

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
//大整数,高位存在数组高位 
//创建大整数结构体
struct gibn{
	int d[1000];
	int len;
	bign{
		memset(d, 0, sizeof(d));
		len = 0;
	}
}; 
//创建大整数结构体变量
bign change(char str[]){
	bign a;
	a.len = strlen(str);
	for(int i =0;i<a.len;i++){
		a.d[i] = str[a.len-1-i]-'0';
	}
	return a;
} 
//对两个大整数进行比较 
int compare(bign a,bign b){
	if(a.len>b.len)
		return 1;
	else if(a.len < b.len)
		return -1;
	else{
		for(int i =a.len-1;i>=0;i--){
			if(a.d[i]>b.d[i])
				return 1;
			else if(a.d[i]<b.d[i])
				return -1;
		}
		return 0;
	}
}
//进行加法
//取余10得出的数据保存在当前位,除10得出的数据存到下一位 
gibn add(gibn a,gibn b){
	bign c;
	int carry = 0;
	for(int i =0;i<a.len||i<b.len;i++){
		int temp = a[i]+b[i]+carry;
		c.d[c.len++] = temp%10;
		carry = temp/10;
	}
	if(carry != 0){
		c.d[c.len++] = carry;
	}
	return c;
} 
//进行减法
gibn sub(gibn a,gibn b){
	bign c;
	for(int i =0;i<a.len||i<b.len;i++){
		//如果当前位不够减 
		if(a.d[i]<b.d[i]){
			a.d[i+1]--;
			a.d[i] += 10; 
		}
		c.d[c.len++] = a.d[i] - b.d[i];
	}
	while(c.len-1>=1 && c.d[c.len-1] == 0){
		c.len--;
	}
	return c;
} 
//进行乘法
gibn multi(gibn a, gibn b) {
	bign c;
	int carry = 0;
	for(int i =0;i<a.len||i<b.len;i++){
		int temp = a[i]*b[i]+carry;
		c.d[c.len++] = temp%10;
		carry = temp/10;
	}
	while(carry != 0){
		c.d[c.len++] = carry%10;
		carry = carry/10;
	}
	return c;	
}
int main(){
	char str1[1000],str2[1000];
	cin>>str1;
	cin>>str2;
	bign a = change(str1);
	bign b = change(str2);
	
	return o;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 6138

猜你喜欢

转载自blog.csdn.net/didadu/article/details/97686471