PAT - 数学类总结

35 篇文章 0 订阅

PAT A 1069 The Black Hole of Numbers (20 分) 

学习点:

1.整型数组和整数的相互转换,整型数组排序实现倒序

2. %04d进行输出,实现缺0补0.

#include<cstdio>
#include<algorithm>
using namespace std;

bool cmp(int a, int b){
    return a > b;
}

void to_array(int n, int number[]){
    for(int i = 0; i < 4; i++){//倒序存进去的
        number[i] = n % 10;
        n /= 10;
    }
}

int to_number(int number[]){
    int n= 0;
    for(int i = 0 ;i < 4; i++){
        n = n * 10 + number[i];
    }

    return n;
}

int main(){
    int n, min, max;
    scanf("%d", &n);
    int number[5];
    while(1){
        to_array(n, number);
        sort(number, number + 4);
        min = to_number(number);
        sort(number, number+4, cmp);
        max = to_number(number);
        n = max - min;
        printf("%04d - %04d = %04d\n", max, min , n);
        if(n == 0 || n == 6174) break;
    }

    return 0;
}

 

PAT B 1013 数素数 (20 分)

注意点:

1. is_prime数组要取得足够大, 1e7

2.输出格式限制,行末只能输出'\n',不能输出空格;最后一行,不能输出多余的空格

3.结束循环,可以用 break

4.数组初始化为同一个值的时候,只能用{0}, {1}的话只会给第一个值赋值。

#include<cstdio>
int prime[10010], pNum = 0;
bool is_prime[10000010] = {0}; // 0 is prime; 1 is not prime
void Find_prime(int N) {
	//int count = 0;
	for (int i = 2; pNum < N; i++) {
		if (is_prime[i] == 0 ) {
			prime[pNum++] = i;
			for (int j = i + i; j < N * 100; j += i)
				is_prime[j] = true;
		}

	}
}

int main() {
	int M, N;
	scanf("%d%d", &M, &N);
	Find_prime(N);
	for (int i = 0; i < N; i++) {
		if (i >= M - 1) {
			printf("%d", prime[i]);
			if ((i - M + 1) % 10 == 9)
				printf("\n");
			else if( i != N - 1)
				printf(" ");
		}
	}


}

PAT A 1059 Prime Factors (25 分)

思路,首先建立素数表,然后对N进行不断的除法,在除的过程中不断地记录。

1. 因为分解直接从2开始的,要特判1=1。

2. long int 的类型其实就是int,在题目中表示冗长了。

3.定义 数组结构体 factor{}的思想很重要。

4.在sqrt(n)的范围内寻找素数,然后可能会留下一个比sqr大的,直接赋值即可,为什么我也不知道。

#include<cstdio>
#include<cmath>

const int maxn = 100010;
int prime[maxn], pNum;
bool is_prime[maxn] = { 0 }; // zero is prime, 1 is not prime

void find_prime(long long max) {
	double sqrt_max = sqrt(1.0 * max);
	for (int i = 2; i < sqrt_max; i++) {
		if (is_prime[i] == 0) {
			prime[pNum++] = i;
			for (int j = i + i; j < sqrt_max; j += i)
				is_prime[j] = 1;
		}
	}
}

struct factor {
	int x;
	int cnt;
}fac[20];

int main() {
	long long N;
	scanf("%lld", &N);
    if( N == 1){
        printf("1=1");
    }
    else{
    printf("%lld=", N);
	find_prime(N);
	int facNum = 0;
	for (int i = 0; i < pNum; i++)
	{
		if (N % prime[i] == 0) {
			fac[facNum].x = prime[i];
			fac[facNum].cnt = 0;
			while (N % prime[i] == 0) {
				fac[facNum].cnt++;
				N /= prime[i];
			}
			facNum++;
		}
        if(N == 1)
            break;
	}
	if (N != 1) {
		fac[facNum].x = N;
		fac[facNum].cnt = 1;
		facNum++;
	}
	
	for (int i = 0; i < facNum; i++) {
		if (fac[i].cnt > 1)
		{
			printf("%d^%d", fac[i].x, fac[i].cnt);
		}
		else if (fac[i].cnt == 1) {
			printf("%d", fac[i].x);
		}
		if (i != facNum - 1)
			printf("*");
	}
    }
	
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值