描述
给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。元素个数不超过100,b在1至100之间。
输入
第一行为数组元素个数和整数b
第二行为数组各个元素
输出
该数组各元素按从小到大排序
输入样例 1
6 2 2 4 6 8 89 90
输出样例 1
Y
首先分析题目,我们需要做以下事情:
1.删除被b整除的元素
2.排序
3.如果元素在A到Z间,替换为字符
1.删除
void dele(int a[],int *n,int i){ //n代表数组长度,i代表删除的位置
for(int j=i;j<*n-1;j++){
a[j]=a[j+1]; //无法做到删除,但我们可以替换
}
(*n)--; //每次作完这件事,n都会少1
}
我们如何在删除的同时也使n这个变量做出变化呢?那就需要用指针!
指针可以修改这个值本身,跳出函数后也依旧可以继续使用。
int i=0;
while(i<n){
if(a[i]%b==0){
dele(a,&n,i);
}else{
i++;
}
}
这里我们使用一个循环来寻找被b整除的值,n是不断变化的,所以不用担心范围问题。
整体代码
#include<stdio.h>
void dele(int a[],int *n,int i){ //n代表数组长度,i代表删除的位置
for(int j=i;j<*n-1;j++){
a[j]=a[j+1]; //无法做到删除,但我们可以替换
}
(*n)--; //每次作完这件事,n都会少1
}
int main(){
int n,b;
int a[102];
int flag=0;
scanf("%d %d",&n,&b);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
if(a[j]>a[j+1]){
int tmp;
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
int i=0;
while(i<n){
if(a[i]%b==0){
dele(a,&n,i);
}else{
i++;
}
}
for(int i=0;i<n-flag;i++){
if(a[i]>='A'&&a[i]<='Z'){
printf("%c ",a[i]);
}else{
printf("%d ",a[i]);
}
}
}