目录
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中的数据由(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
想法:
因为不能使用其他数组,所以只能将原数组开得大一点,再将所有数右移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) 判断是不是常数项