PAT[乙级]1006-1010
1006 换个格式输出整数 (15 分)[字符串处理]
题目描述
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
while(s.size() < 3) s = '0' + s;//前置0
// while(s.size() < 3) s += '0';//后置0
int j = 1;
for(int i = 0 ; i < s[0]-'0' ; ++i) cout << "B";
for(int i = 0 ; i < s[1]-'0' ; ++i) cout << "S";
for(int i = 0 ; i < s[2]-'0' ; ++i) cout << j++;
return 0;
}
思路:
- 知 道 字 符 串 上 限 的 长 度 , 若 没 达 到 上 限 的 长 度 可 以 前 置 0 知道字符串上限的长度,若没达到上限的长度可以前置0 知道字符串上限的长度,若没达到上限的长度可以前置0
- 字 符 串 下 标 对 应 着 要 输 出 的 顺 序 , 其 值 对 应 着 要 输 出 的 个 数 字符串下标对应着要输出的顺序,其值对应着要输出的个数 字符串下标对应着要输出的顺序,其值对应着要输出的个数
1007 素数对猜想 (20 分)[素数]
题目描述
让
我
们
定
义
d
n
为
:
d
n
=
p
n
+
1
−
p
n
,
其
中
p
i
是
第
i
个
素
数
。
显
然
有
d
1
=
1
,
且
对
于
n
>
1
有
d
n
让我们定义d_n为:d_n=p_{n+1}−p_n ,其中p_i是第i个素数。显然有d_1=1,且对于n>1有d_n
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”.
现给定任意正整数N
(<
1
0
5
10^5
105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
代码
#include <bits/stdc++.h>
using namespace std;
int cnt(int n);
int main() {
int n;
cin>>n;
cout<<cnt(n);
return 0;
}
int isprime(int n) {//判断素数
if(n<2)
return 0;
int j = 0;
for( int i = 2 ; i*i <= n ; i++ )
if(!(n%i))
j++;
if(j)
return 0;
else
return 1;
}
int cnt(int n) {//求个数
int j = 0,num[n] ;
for(int i = 2 ; i <= n ; i++)
if(isprime(i))
num[j++] = i;//素数数组
int k = 0;
for(int i = 0 ; i < j ; i++)
if(num[i+1] - num[i] == 2)
k++;//计数
return k;//返回计数结果
}
思路:
- 直 接 从 [ 2 , n ] 循 环 遍 历 , 如 果 是 素 数 就 存 入 数 组 中 直接从[2,n]循环遍历,如果是素数就存入数组中 直接从[2,n]循环遍历,如果是素数就存入数组中
- 然 后 对 数 组 进 行 遍 历 , 如 果 其 值 相 差 2 , 就 开 始 计 数 然后对 数组进行遍历,如果其值相差2,就开始计数 然后对数组进行遍历,如果其值相差2,就开始计数
1008 数组元素循环右移问题 (20 分)[模拟]
题目描述
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(
A
0
A
1
.
.
.
.
.
A
n
−
1
A_0A_1.....A_{n-1}
A0A1.....An−1)变换为(
A
N
−
M
.
.
.
A
N
−
1
A
0
A
1
.
.
.
A
N
−
M
−
1
A_{N-M}...A_{N-1}A_0A_1...A_{N-M-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 <bits/stdc++.h>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
int num[n];
for(int i = 0 ; i < n ; i++)
cin>>num[i];
m %= n; //m可能大于n
for(int i = 0 ; i < n ; i++)
cout << num[(n+i-m)%n] << " \n"[i == n-1];
//记住这个公式
return 0;
}
思路:
输入: 6 2 | 6 3
下标: 0 1 2 3 4 5 | 0 1 2 3 4 5
值 : 1 2 3 4 5 6 | 1 2 3 4 5 6
输出: 5 6 1 2 3 4 | 4 5 6 1 2 3
对应原下标: 4 5 0 1 2 3 | 3 4 5 1 2 3
所以:下标为(6-2)%6的先输出
一般的下标为 (N-M)%N 的先输出
1009 说反话 (20 分)[字符串处理]
题目描述
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
string s;
vector<string>sl;
int i = 0;
while( cin>>s ) sl.push_back(s);
//利用反向迭代器进行颠倒
for(auto i = sl.rbegin() ; i != sl.rend() ; ++i)
cout << *i <<" \n"[i == sl.rend()-1];
return 0;
}
1010 一元多项式求导 (25 分)[模拟]
题目描述
设
计
函
数
求
一
元
多
项
式
的
导
数
.
(
注
:
x
n
(
n
为
整
数
)
的
一
阶
导
数
为
n
x
n
−
1
.
)
设计函数求一元多项式的导数.(注:x^n(n为整数)的一阶导数为nx^{n−1}.)
设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
代码
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
int a,n,f=1,g=1;
while(cin>>a>>n) {
if( n ) {//若指数不为0就输出,大部分是最后一项
f = 0;
if( g ) {
g = 0;
cout<<a*n<<" "<<n-1;
}
else
cout<<" "<<a*n<<" "<<n-1;
}
}
if( f )//若一开始的指数为0,就输出(易错点)
cout<<"0 0";
return 0;
}