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; }