PAT乙级 :1006 ~1010 题解【C语言】

目录

1006 换个格式输出整数 

1007 素数对猜想

1008 数组元素循环右移问题

1009 说反话

1010 一元多项式求导


1006 换个格式输出整数 

题目:

让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。

输入格式:

每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。

输出格式:

每个测试用例的输出占一行,用规定的格式输出 n。

样例:

输入1:                                                                      输入2:

234                                                                              23

输出1:                                                                      输出2:

BBSSS1234                                                                SS123

想法:

先把各位数字取出,再分类对个十百位分别操作,无脑做法

参考代码:

#include<stdio.h>
int main(){
	int n=0,i=0,m=0;
	int a[4]={0};
	char b[30]={};
	scanf("%d",&n);
	while(n>0){                                     //(1)
		a[i]=n%10;
		n/=10;
		i++;
	}
	for (int j=0;j<=i-1;j++){
		if (j==0){                                  //(2)
			for (;a[j]>0;a[j]--) b[m++]=a[j]+'0';
		}
		if (j==1){                                  //(3)
			for (;a[j]>0;a[j]--) b[m++]='S';
		}
		if (j==2){                                  //(4)
			for (;a[j]>0;a[j]--) b[m++]='B';
		}
	}
	m--;
	for (;m>=0;m--){
		printf("%c",b[m]);
	}
	return 0;
}

(1)取出数字的个位,十位,百位

(2)判断是否有个位,再对个位操作

(3)判断是否有十位,再对十位操作

(4)判断是否有百位,再对百位操作

1007 素数对猜想

题目:

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

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

输入格式:

输入在一行给出正整数N

输出格式:

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

样例:

输入:

20

输出:

4

想法:

对小于正整数N的数依次遍历,先判断是否为素数,再判断与前面素数的差是否为2

参考代码:

#include<stdio.h>
#include<math.h>
int main(){
	int n,sum=0,flag=1;
	scanf("%d",&n);
	int a[2]={3,0};                           //(1)
	for (int i=5;i<=n;i++){
		for (int j=2;j<=(int)sqrt(i);j++){    //(2)
			if (i%j==0) {
				flag=0;
				break;
			}
		}
		if (flag==1){                         //(3)
			a[1]=i;
			if (a[1]-a[0]==2) sum++;
			a[0]=a[1];
		}
		flag=1;
	}
	printf("%d",sum);
	return 0;
}

(1)建立一个数组存储相邻的素数,用原地算法可以避免数组开太大

(2)判断是否为素数

(3) 判断相邻素数差是否为2

1008 数组元素循环右移问题

题目:

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

想法:

因为不能使用其他数组,所以只能将原数组开得大一点,再将所有数右移m%n(m可能大于n,不取余的话肯定会错)个单位,然后把从右往左数m个数字移到起始位置

参考代码:

#include<stdio.h>
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	int a[200];
    m%=n;                                         //(1)
	for (int i=0;i<n;i++) scanf("%d",&a[i]);
	for (int i=n-1;i>=0;i--) a[i+m]=a[i];         //(2)
	for (int i=0;i<m;i++) a[i]=a[i+n];            //(3)
	for (int i=0;i<n;i++) {
        if (i==n-1) printf("%d",a[i]);
        else printf("%d ",a[i]);
    }
	return 0;
}

(1)对m取余,移动n位相当于不变

(2)向右移动m位

(3) 将右往左数m个数放到开头

1009 说反话

题目:

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

输入格式:

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

输出格式:

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

样例:

输入:

Hello World Here I Come

输出:

Come I Here World Hello

想法:

从后往前搜空格,搜到空格对前一个单词输出

参考代码:

#include<stdio.h>
#include<string.h>
int main(){
	int i,j;
	char message[81];
	gets(message);
	int len=strlen(message);
	j=len-1;
	for (i=len-1;i>=0;i--){
		if (message[i]==' '){                                   //(1)
			for (int m=i+1;m<=j;m++) printf("%c",message[m]);   
			if (i!=0) printf(" ");                              //(2)
			j=i-1;
		}
		else if (i==0) {                                        //(3)
			for (int m=i;m<=j;m++) printf("%c",message[m]);
		}
	}
	return 0;
}

(1)如果是空格对前面的单词输出,i+1为单词起始位置,j为单词末尾

(2)如果这个空格不是最后一个,就需要输出单词与单词间的空格

(3) 如果i=0,这时候最后一个单词不会检测到空格,但要将其输出

1010 一元多项式求导

题目:

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

输入格式:

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

输出格式:

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

样例:

输入:

3 4 -5 2 6 1 -2 0

输出:

12 3 -10 1 6 0

想法:

系数是之前的系数乘指数,指数为之前的指数减一,但原本这个数就是常数就要输出“0 0”

参考代码:

#include<stdio.h>
int main(){
	int a[1000]={0};
	int num1,num2,t=0;
	while(1){
		if (scanf("%d%d",&num1,&num2)){         
            char c=getchar();                   //(1)
		    if (num1*num2!=0) { 
			    a[t++]=num1*num2;               //(2)
			    a[t++]=num2-1;
		    }
            if (c=='\n') break;
        }
	}
	if (t>0){                                   //(3)
		for (int i=0;i<t;i++){
			if (i==t-1) printf("%d",a[i]);
			else printf("%d ",a[i]);
		}
	}
	else printf("0 0");
	return 0;
}

(1)这个用来判断数据是否已经读完

(2)算求导后的系数和指数

(3) 判断是不是常数项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值