【C】PAT 1006-1010
1006 换个格式输出整数
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
思路:
题目限制整数的位数最多三位,那么可以提取三位上的数字就可以了。某一位为0,那么循环根本不会执行,因此也不需要写额外的判断语句。
代码:
#include <stdio.h>int main(){int n;scanf("%d",&n);for (int i=0; i < n/100; i++)putchar('B');for (int i = 0; i < n / 10 % 10; i++)putchar('S');for (int i = 0; i < n % 10; i++)putchar('1' + i);}
1007 素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
思路:
初始化:100个素数里初始化便写入前两个2,3,从4开始验证,这样不影响边界情况(N=5之前没有孪生素数),避免了2这样没有更小的素数可供验证的情况,并且进入循环即可开始验证孪生素数。
N | 孪生素数对数 |
---|---|
1~4 | 0 |
20 | 4 |
100 | 8 |
1000 | 35 |
10000 | 205 |
100000 | 1224 |
代码:
#include <stdio.h>int main()
{int N;scanf("%d", &N);/* Record primality of three successive numbers starting from 2, 3, 4 */int iPrimeMinus2 = 1, iPrimeMinus1 = 1, iPrime;int primes[100] = {2, 3}; /* Record the prime numbers before sqrt(10^5) */int twincount = 0; /* Count of twin primes */int primecount = 2; /* Count of prime numbers *//* Start from 4 */for (int i = 4; i <= N; i++) {/* Test if i is a prime number */iPrime = 1;for (int j = 0; iPrime && primes[j] * primes[j] <= i; j++)if (i % primes[j] == 0)iPrime = 0;/* If i is a prime number, record */if (iPrime) {if (primecount < 100) primes[primecount++] = i;if (iPrimeMinus2 == 1) twincount++; /* a prime pair found */}/* Shift the primality flags to next numbers */iPrimeMinus2 = iPrimeMinus1;iPrimeMinus1 = iPrime;}printf("%d", twincount);return 0;
}
1008 数组元素循环右移
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
代码:
#include <stdio.h>int main()
{int N, M, numbers[100];scanf("%d %d", &N, &M);M %= N; /* M could be larger than N *//* Read */for (int i = 0; i < N; i++)scanf("%d", &numbers[i]);/* Print */for (int i = N - M; i < N; i++) /* Print N - M to N - 1 */printf("%d ", numbers[i]);for (int i = 0; i < N - M - 1; i++) /* Print 0 to N - M - 2 */printf("%d ", numbers[i]);printf("%d", numbers[N - M - 1]); /* Print N - M - 1, no blankspace */return 0;
}
1009 说反话
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路:
只用一个字符串,从后向前搜索单词,依次输出。
代码:
#include <stdio.h>
#include <string.h>int main()
{char s[82], *p;scanf("%[^\n]", s);for (p = s + strlen(s) - 1; p >= s; p--) {if (*(p - 1) == ' ')printf("%s ", p);if (p == s)printf("%s", p);if (*p == ' ')*p = '\0';}return 0;
}
1010 一元多项式求导
设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0
。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
代码:
#include <stdio.h>int main()
{int coef, index, count = 0;while (scanf("%d %d", &coef, &index) != EOF) {if (index) { /* Constant terms result in zero */if (count++) putchar(' ');printf("%d %d", coef * index, index - 1);}}/* Zero polynomial or constant */if (count == 0)puts("0 0");return 0;
}