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中的数据由(A0​​A1​​AN1​​)变换为(ANM​​AN1​​A0​​A1​​ANM1​​)(最后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

 

posted @ 2020-02-04 22:28  Cs-老oier  阅读(184)  评论(0)    收藏  举报