7-1-1
本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
输入格式:
输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。
输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
将x插入到大于等于前一项,小于后一项的位置。
#include <stdio.h>
int main()
{
int n,x,i=0,a[100];
scanf("%d",&n);
for(;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&x);
for(i=0;i<n;i++){
if (a[i+1]>x && a[i]<=x){
printf("%d ",a[i]);
printf("%d ",x);
}else {
printf("%d ",a[i]);
}
}
return 0;
}
7-1-2
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
要求是逆序存,再顺序输出
#include <stdio.h>
int main()
{
int n,a[100],b[100],i=0;
scanf("%d",&n);
for (;i<n;i++){
scanf("%d",&a[i]);
}
for (i-=1;i>=0;i--){
b[n-i-1]=a[i];
}
for (i=0;i<n;i++){
printf("%d ",b[i]);
}
return 0;
}
7-1-3
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
倒着遍历,取最小下标。
#include <stdio.h>
int main()
{
int n,a[100],i=0,max,j;
scanf("%d",&n);
for (;i<n;i++){
scanf("%d",&a[i]);
}
i-=1;
max=a[i];
for (i-=1;i>=0;i--){
if (a[i]>=max) {
max=a[i];
j=i;
}
}
printf("%d %d",max,j);
return 0;
}
7-1-4
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
数组指针交换。比较前后项的大小,循环n-1次排序。
#include <stdio.h>
void change(int *a,int i){
int t;
t=*(a+i);
*(a+i)=*(a+i+1);
*(a+i+1)=t;
}
int main()
{
int n,a[100],i=0,j=0;
scanf("%d",&n);
for (;i<n;i++){
scanf("%d",&a[i]);
}
while (j<=n-1){
for (i-=1;i>=0;i--){
if (a[i+1]>a[i] && i+1<n) {
change(&a[0],i);
}
}
j++;
i=n;
}
for (i=0;i<n-1;i++){
printf("%d ",a[i]);
}
printf("%d",a[i]);
return 0;
}
7-1-5
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
先找到最大值、最小值和对应的下标。
先交换最小值与第一个数的位置,如果原来第一个数是最大值,那么交换后最大值的下标变为原来最小值的下标。
再交换最大值和最后一个数的位置。
#include <stdio.h>
void change(int *a,int i,int j){
int t;
t=*(a+i);
*(a+i)=*(a+j);
*(a+j)=t;
}
int main()
{
int n,a[100],i=0,max,min,j=0,k=0;
scanf("%d",&n);
for (;i<n;i++){
scanf("%d",&a[i]);
}
max=a[0];
min=a[0];
for (i-=1;i>=0;i--){
if (a[i]>max) {
max=a[i];
j=i;
}
if (a[i]<min) {
min=a[i];
k=i;
}
}
change(&a[0],k,0);
if (j==0) j=k;
change(&a[0],j,n-1);
for (i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
7-1-6
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入格式:
输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
输出格式:
在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
题目的正整数N好像没啥用?
先计算每个数字的个数,存到b[10]中。
再找b[10]中最大的值,最后输出值对应的下标(就是对应的数字)。
#include <stdio.h>
int main()
{
int n,b[10]={0};
char a;
scanf("%d",&n);
getchar();
a=getchar();
while (a!='\n'){
switch (a) {
case '0':
b[0]++;
break;
case '1':
b[1]++;
break;
case '2':
b[2]++;
break;
case '3':
b[3]++;
break;
case '4':
b[4]++;
break;
case '5':
b[5]++;
break;
case '6':
b[6]++;
break;
case '7':
b[7]++;
break;
case '8':
b[8]++;
break;
case '9':
b[9]++;
break;
default:
break;
}
a=getchar();
}
int max;
max=b[0];
for (a=0;a<10;a++){
if (b[a]>max) max=b[a];
}
printf("%d:",max);
for (a=0;a<10;a++){
if (b[a]==max) {
printf(" %d",a);
}
}
return 0;
}
7-1-7
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
遍历数组找数字,找到了输出下标。
#include <stdio.h>
int main()
{
int n,x,i=0;
scanf("%d",&n);
int a[n];
scanf("%d",&x);
for(;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if (a[i]==x) {
printf("%d",i);
i=n;
}
}
if (i==n) printf("Not Found");
return 0;
}
7-1-8
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
好难,我想吃面了——曹操
先找2个数组共有的数字,存到c[20]。
a[n1]与c[20]对比,不同的存入d[20]。同时a[n1]也要和d[20]中已有的数对比,相同的数字不再存入。
b[n2]相同的处理方式。
处理完成后,d[20]中存的就是不共有的数字,且不重复。
#include <stdio.h>
int main()
{
int n1,n2,i=0,j=0,c[20],k=0,d[20],l=0;
int flag=0;
//录入第一个数组a[n1]
scanf("%d",&n1);
int a[n1];
for(i=0;i<n1;i++){
scanf("%d",&a[i]);
}
//录入第二个数组b[n1]
scanf("%d",&n2);
int b[n2];
for(i=0;i<n2;i++){
scanf("%d",&b[i]);
}
//a[n1]与b[n2]相同的数存入c[20]
//k为c[20]中数字的个数
for(i=0;i<n1;i++){
for(j=0;j<n2;j++){
if(a[i]==b[j]){
c[k]=a[i];
k++;
}
}
}
//a[n1]对比c[20]、d[20]中所有的数字,不同的存入d[20]
//l为d[20]中数字的个数
//l=0时不用对比a[i]与d[20],先存入d[0]
//l>0时需要对比a[n1]与d[20],不要重复的数字
for(i=0;i<n1;i++){
flag=0;
for(j=0;j<k;j++){
if(a[i]==c[j]){
flag=1;
break;
}
}
if (l>0) {
for(j=0;j<l;j++){
if(a[i]==d[j]){
flag=1;
break;
}
}
}
if(flag==0){
d[l]=a[i];
l++;
}
}
//b[n2]相同的处理方式
for(i=0;i<n2;i++){
flag=0;
for(j=0;j<k;j++){
if(b[i]==c[j]){
flag=1;
break;
}
}
if (l>0){
for(j=0;j<l;j++){
if(b[i]==d[j]){
flag=1;
break;
}
}
}
if(flag==0){
d[l]=b[i];
l++;
}
}
//输出d[20],行末不得有多余的空格
for(i=0;i<l-1;i++){
printf("%d ",d[i]);
}
printf("%d",d[i]);
return 0;
}
7-1-9
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
输入格式:
输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。
输出格式:
在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。
b[n]为去重后的数组,c[1000]为对应数字出现的次数。
遍历对比a[n]与b[n]。如果数字相等,证明b[n]中已有该数字,对应c[1000]加1。
如果数字不相等,b[n]中增加该数字,对应c[1000]加1。
最后c[1000]中最大的数字就是最大的次数,b[n]中相同下标的数字为出现次数最多的数字。
比如:a[3]={1,1,2}, 第一次循环后:b[0]=1, c[0]=1。
第二次循环后:b[0]=1, c[0]=2。
第三次循环后:b[0]=1, b[1]=2, c[0]=2, c[1]=1。
出现次数最多的是2次,数字1。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n],i=0;
for(;i<n;i++){
scanf("%d",&a[i]);
}
//b[n]为a[n]去重的数组,k为b[n]中数字的个数
//c[1000]为数字对应的次数
//flag=0表示数字相等,b[n]中已有该数字,c[1000]中对应次数+1,遍历a[n]的下一个数字。
//flag=1表示数字不相等,再遍历b[n]的下一个数字。保证b[n]中无该数字时,再增加b[k]
int b[n],c[1000]={0},j=0,k=1,flag;
b[0]=a[0];
for(i=0;i<n;i++){
flag=0;
for(j=0;j<k;j++){
if (a[i]==b[j]){
c[j]++;
flag=0;
break;
} else {
flag=1;
}
}
if (flag==1){
b[k]=a[i];
c[k]++;
k++;
}
}
//题目保证最大值唯一,所以找c[1000]最大数的下标就行
int max=c[1];
for(i=0;i<k;i++){
if(c[i]>max){
max=c[i];
j=i;
}
}
printf("%d %d",b[j],c[j]);
return 0;
}
7-1-10
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
将给的内容转换为实际的数字,转换完就是从小到大排序的。0不能做首位,最小的数只需将非0的最小数字(从左到右第一个非0的数)换到第一位即可。
#include <stdio.h>
int main()
{
int a[10],i=0,b[10],j=0,k=0;
for(;i<10;i++){
scanf("%d",&a[i]);
}
//转为数字(从小到大排序的)
for(i=0;i<10;i++){
if(a[i]!=0){
j+=a[i];
for(;k<j;k++){
b[k]=i;
}
}
}
//第一个非0数与第一位交换(0不能放首位)
for(i=0;i<k;i++){
if (b[i]!=0){
break;
}
}
j=b[i];
b[i]=b[0];
b[0]=j;
for(i=0;i<k;i++){
printf("%d",b[i]);
}
return 0;
}
7-1-11
假设有N项物品,大小分别为s1、s2、…、si、…、sN,其中si为满足1≤si≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数si(1≤si≤100,表示第i项物品的大小)。
输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
复制数组到a[1000]。第一次输出的数是s[0] 1。
从a[i]开始和a[j]计算,如果和大于100,a[i]与下一项计算。最大到a[i-1],还不满足就把a[i]放最后,输出s[i]和对应的下标+1。
如果和小于100,a[i]放到a[j]的位置上,a[j]需要加上a[i],a[i]=0,输出s[i]和a[j]的位置。
所需的箱子数目是输出位置的最大值。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int s[n],i;
for(i=0;i<n;i++){
scanf("%d",&s[i]);
}
int j=0,a[1000],max=0;
for(i=0;i<n;i++){
a[i]=s[i];
}
printf("%d %d\n",s[0],1);
for(i=1;i<n;i++){
for(j=0;j<i;j++){
if(a[i]+a[j]<=100){
a[j]+=a[i];
a[i]=0;
break;
}
}
printf("%d %d\n",s[i],j+1);
if(j+1>max) max=j+1;
}
printf("%d",max);
return 0;
}