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

思路:

  1. 知 道 字 符 串 上 限 的 长 度 , 若 没 达 到 上 限 的 长 度 可 以 前 置 0 知道字符串上限的长度,若没达到上限的长度可以前置0 ,0
  2. 字 符 串 下 标 对 应 着 要 输 出 的 顺 序 , 其 值 对 应 着 要 输 出 的 个 数 字符串下标对应着要输出的顺序,其值对应着要输出的个数 ,

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+1pn,piid1=1n>1dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为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;//返回计数结果
}

思路:

  1. 直 接 从 [ 2 , n ] 循 环 遍 历 , 如 果 是 素 数 就 存 入 数 组 中 直接从[2,n]循环遍历,如果是素数就存入数组中 [2,n],
  2. 然 后 对 数 组 进 行 遍 历 , 如 果 其 值 相 差 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.....An1)变换为( 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} ANM...AN1A0A1...ANM1)最后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}.) .(xnnnxn1.
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值