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<iostream>

using namespace std;

int a[3] = {0};

int main(){
	int n;
	cin >> n;
	int i = 0;
	while(n != 0){
		a[i] = n%10;
		n /= 10;
		i++;
	}		
	while(a[2]--){
		cout << "B";
	}
	while(a[1]--){
		cout << "S";
	}
	for(i = 1;i <= a[0];i++){
		cout << i;
	}
	return 0;
} 

1007 素数对猜想 (20 分)

让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

作者: CHEN, Yue

单位: 浙江大学

时间限制: 200 ms

内存限制: 64 MB

#include<iostream>
#include<cmath>

using namespace std;
int a[100000] = {0};

int isPrime(int num){
    int flag = 1;
    int temp = sqrt(num);
    int i;
    for(i = 2; i <= temp; i++){
        if(num % i == 0) flag = 0;
    }
    return flag;
}
 
int main(){
	int n;
	cin >> n;
	
	a[0] = 1;
	a[1] = 2;
	int count = 2;
	int num = 0;
	for(int i = 3;i <= n;i++){
		if(isPrime(i)){
			a[count] = i;
			if((a[count] - a[count-1]) == 2){
				num++;	
			}
			count++;
		}
	}
	cout << num;
	return 0; 
} 

1008 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−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<iostream>

using namespace std;
int queue[100] = {0}; 

int main(){
	int num,sc;
	cin >> num >> sc;
	for(int i = 0;i < num;i++){
		cin >> queue[i];
	}
	int head = (num - sc%num);
	for(int i = head,j = 0;j < num;j++,i++){
		cout << queue[i%num];
		if(j!=num-1){
			cout << " ";
		}
	}
	return 0; 
} 

1009 说反话 (20 分)

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello
#include<iostream>
#include<cstring>
using namespace std;

int main(){
	char str[81];
	cin.getline(str,80); //读入空格 
	char* p = str;
	
	char word[40]; //输出栈 
	int t = 0; //输出栈下标 
	
	int len = strlen(str);
	for(int i = len - 1;i >= 0;i--){
		if(*(p + i) == ' '){
			while(t != 0){
				cout << word[--t];
			}			
			cout << " ";
		}
		else if(*(p + i) >= 'a' && *(p + i) <= 'z'){
			word[t++] = *(p + i); //入栈 
		}
		else if(*(p + i) >= 'A' && *(p + i) <= 'Z'){
			word[t++] = *(p + i);
		} 
	} 
	while(t != 0){
		cout << word[--t];
	}		
	return 0;
}

/*
※代码第四个测试用例一直没过,还没找到原因
*/

1010 一元多项式求导 (25 分)

设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nx​n−1​​。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0
#include <iostream>
#include<cstdlib>
using namespace std;

struct duo{
	int x;
	int z;
}Duo[1001]; 
int count = 0;

int main() {
	int xtmp,ztmp;
	while(cin >> xtmp >> ztmp){
		if(ztmp){  
           Duo[count].x = xtmp;
           Duo[count].z = ztmp;
           count++;
        }      
	}
  
	for(int i = 0;i < count;i++){
		cout << Duo[i].x * Duo[i].z << " ";
		cout << Duo[i].z - 1;		
		if(i != count - 1){
			cout << " ";
		}
	}
	if(count == 0){
		cout << "0 0";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jh8w8m/article/details/87612640
今日推荐