目录
实验7-1-1 简化的插入排序
实验7-1-5 交换最小值和最大值
实验7-1-6 求一批整数中出现最多的个位数字
实验7-1-8 找出不是两个数组共有的元素
实验7-1-9 求整数序列中出现次数最多的数
实验7-1-10 组个最小数
实验7-1-11 装箱问题
实验7-1-1 简化的插入排序
//先将数据存入一个数组,然后遍历数组找到第一个大于x的数字,然后将其数据后移
//然后空出来的位置则保存x
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
int a[n+1];
for(int i=0;i<n;i++){
scanf("%d ",&a[i]);
}
int x;
scanf("%d",&x);
//n==0的时候
if(n==0){
printf("%d ",x);
return 0;
}
int i=0;
while(a[i]<x&&i<n){//查找x应该插入的位置
i++;
}
//当所有元素都小于x的时候,直接插入最后
if(i==n){
a[i]=x;
for(int i=0;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}
//将i~n元素向后移一位
for(int j=n-1;j>=i;j--){
a[j+1]=a[j];
}
a[i]=x;
//输出看看
for(int i=0;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}
实验7-1-5 交换最小值和最大值
注意:这里是交换完第一部之后的数组,再执行第二部交换。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int min=a[0],minval=0;
for(int i=1;i<n;i++){
if(a[i]<min){
minval=i;
min=a[i];
}
}// of for
int temp=a[minval];
a[minval]=a[0];
a[0]=temp;
int max=a[0],maxval=0;
for(int i=1;i<n;i++){
if(a[i]>max){
max=a[i];
maxval=i;
}
}
temp=a[maxval];
a[maxval]=a[n-1];
a[n-1]=temp;
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
}
实验7-1-6 求一批整数中出现最多的个位数字
//思路:把每个数字分解成个位,直接%10,
//然后出现一个数字就在相应的数组a[10]上面+10
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int b[10]={0};//用于记录0-9出现的次数
for(int i=0;i<n;i++){
if(a[i]==0){
b[0]++;
}
while(a[i]>0){
int x=a[i]%10;
b[x]++;
a[i]=a[i]/10;
}
}
int max=b[0],maxval=0;
for(int i=1;i<10;i++){
if(b[i]>max){
max=b[i];
maxval=i;
}
}
printf("%d:",max);
for(int i=0;i<10;i++){
if(b[i]==max){
printf(" %d",i);
}
}
return 0;
}
实验7-1-8 找出不是两个数组共有的元素
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//构造一个函数如果数字x出现在数组c中,则返回1
int cunzai(int *a,int n,int x){
for(int i=0;i<n;i++){
if(a[i]==x){
return 1;
}
}
return 0;
}
int main(){
int N1;
scanf("%d",&N1);
int a[N1];
for(int i=0;i<N1;i++){
scanf("%d",&a[i]);
}
int N2;
scanf("%d",&N2);
int b[N2];
for(int i=0;i<N2;i++){
scanf("%d",&b[i]);
}
int c[20];
int cc=0;//非公共元素保存在c中
for(int i=0;i<N1;i++){
if(cunzai(b,N2,a[i])==0&&cunzai(c,N2,a[i])==0){
c[cc]=a[i];
cc++;
}
}//判断第一个数组中的元素,非公有,保存在c中
for(int i=0;i<N2;i++){
if(!cunzai(a,N1,b[i])&&!cunzai(c,N1,b[i])){
c[cc]=b[i];
cc++;
}
}//判断第二个数组中的元素,非公有,保存在c中
for(int i=0;i<cc;i++){
if(i==cc-1){
printf("%d",c[i]);
}else{
printf("%d ",c[i]);
}
}
return 0;
}
实验7-1-9 求整数序列中出现次数最多的数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
int N;
scanf("%d",&N);
int a[1000];
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
}
int max=0,num=0,x;
for(int i=0;i<N;i++){
num=1;
for(int j=i+1;j<N;j++){//后面有几个相同的??
if(a[i]==a[j]){
num++;
}
}
if(num>max){
max=num;
x=a[i];
}
}
printf("%d %d",x,max);
}
实验7-1-10 组个最小数
其实不用找到这个最小的值,直接按位输出就可以了。
//第一位必须从a[1]-a[9]中取最小的,数字之和就表示位数
//然后从第二位开始就a[0]-a[9]中取最小的,每去一个数就a[i]--
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
int a[10];
int sum=0;
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
sum=sum+a[i];
}//a[i]表示i所有的个数
for(int i=1;i<10;i++){
if(a[i]!=0){
printf("%d",i);
a[i]--;
sum--;
break;
}
}//找到了第一位
for(int i=0;i<10;){
if(a[i]!=0){
printf("%d",i);
sum--;
a[i]--;
}
if(a[i]==0){
i++;
}
}
}
实验7-1-11 装箱问题
//给你N个箱子,每个箱子初始装入都是0
//,每个货物装箱都是从第一个箱子开始看,直到找到100-已装货物>=要装货,
//每装入一个货物就+重量,
//a[i]表示第i个箱子,现在装有的货物
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
int N=0;
scanf("%d",&N);
int a[N+1];
for(int i=0;i<N+1;i++){
a[i]=0;
}
for(int i=0;i<N;i++){
int s;
scanf("%d",&s);
for(int j=1;j<N+1;j++){
if(100-a[j]>=s){
printf("%d %d\n",s,j);
a[j]=a[j]+s;
break;
}
}
}
int num=0;
for(int i=1;i<N+1;i++){
if(a[i]!=0){
num++;
}
}
printf("%d",num);
return 0;
}