PTA Basic Level (1006-1008)
P1006
让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12…n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
不优良的代码,重复步骤过多(纯粹复习switch case 语句)
1 #include <stdio.h>· 2 int main() 3 { 4 int n, store_1, store_2, i; 5 scanf("%d", &n); 6 store_1 = n / 10; 7 switch (store_1) 8 { 9 case 0: 10 for(i=1;i<=(n%10);i++) 11 printf("%d", i); 12 break; 13 default: 14 store_1 /= 10; 15 store_2 = (n / 10)%10; 16 if (store_1 != 0){ 17 for (i=1;i<=store_1;i++) 18 printf("B"); 19 for (i=1;i<=store_2;i++) 20 printf("S"); 21 for(i=1;i<=(n%10);i++) 22 printf("%d", i); 23 } 24 else { 25 for (i=1;i<=store_2;i++) 26 printf("S"); 27 for(i=1;i<=(n%10);i++) 28 printf("%d", i); 29 } 30 } 31 return 0; 32 33 }
拥有统一的出口的代码
1 #include <stdio.h> 2 int main() 3 { 4 int n, store_1, store_2,store_3, i; 5 scanf("%d", &n); 6 store_1 = n % 10; 7 store_2 = (n / 10) % 10; 8 store_3 = n / 100; 9 for (i=1;i<=store_3;i++) 10 printf("B"); 11 for (i=1;i<=store_2;i++) 12 printf("S"); 13 for(i=1;i<=store_1;i++) 14 printf("%d", i); 15 16 return 0; 17 18 }
P1107
题目:1007素数对猜想(20分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10^5),请计算不超过N的满足猜想的素数对的个数。
输入格式
输入在一行给出正整数n
输出格式
在一行中输出不超过n的满足猜想的素数对的个数
输入样例
20
输出样例
4
暴力:
1 #include <stdio.h> 2 #include <math.h> 3 int main() 4 { 5 int i, n, sum,j; 6 scanf("%d", &n); 7 int a[n]; 8 sum =0; 9 for(i=2;i<=n;i++) 10 a[i]=1; 11 a[1] = 0; 12 for(i=3;i<=n;i++) 13 { 14 if (i % 2 == 0) a[i] = 0; 15 else{ 16 for (j=2;j<=sqrt(i);j++){ 17 if (i%j==0){ 18 a[i]=0;break; 19 } 20 21 } 22 if (a[i]+a[i-2]==2) sum++; 23 } 24 } 25 printf("%d", sum); 26 return 0; 27 }
需要注意判断素数时压缩到sqrt, 否则此题会超时,因为只能运行(10^4)^2次
方法二
先进行数学判断:
首先我们要明白怎么判断一个数是否是素数(2,3,5,7。。。)
质数有个特点就是它总是6k-1或者6k+1,其中k为大于1的自然数
如何论证这个结论呢,其实不难。首先 6x 肯定不是质数,因为它能被 6 整除;其次 6x+2 肯定也不是质数,因为它还能被2整除;依次类推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5 (即等同于6x-1) 可能是质数了。所以循环的步长可以设为 6,然后每次只判断 6 两侧的数即可。
每次再判断一个数是否为质数时只需要判断2到根号n的数能否被n整除,如果存在可以被整除的数则为合数,否则为质数。
P1008
一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1)和M(≥);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
一般思路:
1 #include <stdio.h> 2 int main() 3 { 4 int i, n, sum, j, m; 5 scanf("%d %d", &n, &m); 6 int a[n]; 7 for (i = 1; i <= n; i++) 8 { 9 scanf("%d", &a[i]); 10 } 11 m %= n; 12 for (i = n-m+1; i <= n; i++) 13 { 14 printf("%d ", a[i]); 15 } 16 for (i = 1; i<n-m+1;i++) 17 { 18 printf(i==1?"%d":" %d" ,a[i]); 19 } 20 return 0; 21 }
注意对最后一个数空格的输出判断
数学思想:
(XY)‘=Y'X' 这是逆的性质 此题也可如此来实现
先将整体元素颠倒,然后再将前M个元素和剩余元素分别Reverse

浙公网安备 33010602011771号