2022秋 C理论A_ 编程练习4 - 数组

7-1 冒泡法排序

将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(

输入格式:

输入在第1行中给出N和K(1≤K

输出格式:

在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

输入样例:

6 2
2 3 5 1 6 4

输出样例:

2 1 3 4 5 6

代码段:


#include 
#include 
#define N 100
 
int main()
{
    int n,k,arr[N],i,j,t;
    scanf("%d%d",&n,&k);
    for(i=0;iarr[i+1])
            {
                t=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=t;
            }
        }
    }
    for(i=0;i

7-2 评委打分.

班级里要搞智力竞赛啦!同学们都踊跃参加。进入最后决赛的是10个同学,随着一道道题目的出示,有时是1号选手得分,有时是5号选手得分,每次答对者得10分,最后结果如何呢?

输入格式:

第一行有十个整数,表示十位同学的初始分。第二行一个整数n,表示有n道题竞赛。
接下去有n行,每行有一个数字x,x表示本次可以加分的选手序号(每次答对者得10分)。

输出格式:

10个同学最终的得分值,每两位同学之间有一个空格。

输入样例:

10 0 0 0 10 10 0 0 0 10
3
1
10
1

输出样例:

30 0 0 0 10 10 0 0 0 20

代码段:

#include 

int main()
{
    int a[10];
    int n,i,temp;
    for(i=0;i<=9;i++)
        scanf("%d ",&a[i]);
    scanf("\n%d\n",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d\n",&temp);
        a[temp-1]=a[temp-1]+10;
    }
    for(i=0;i<=8;i++)
        printf("%d ",a[i]);
    printf("%d",a[9]);
}

7-3 组合数的和

给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。

输入格式:

输入在一行中先给出 N(1 < N < 10),随后一行给出 N 个不同的非 0 个位数字。数字间以空格分隔。

输出格式:

输出所有可能组合出来的2位数字的和。

输入样例:

3
2 8 5

输出样例:

330

代码段:

#include 

int main()
{
    int a[10],i,j,sum,n;
    scanf("%d ",&n);
    for(i=0;i=0;i--)
        for(j=i-1;j>=0;j--)
        {
            sum=sum+a[i]*10+a[j];
        }
    printf("%d",sum);
}

7-4 找不同

这是一个签到题,非常简单。一群网友在网上在玩游戏,看谁是最与众不同的,每一个人都单独写一个数字,然后依次上交,谁的数据没有和其他人重复,谁就赢了,如果有很多人都与众不同,那么第一个做到的才是真正的与众不同。

输入格式:

输入是一个测试用例,首先给出网友个数N,之后依次给出N个正整数,给出的正整数和N都不超过10的5次方。

输出格式:

对每一组输入,输出与众不同的那个数,如果没有,输出None

输入样例1:

在这里给出一组输入。例如:

8 1 2 3 4 4 5 3 1

输出样例1:

在这里给出相应的输出。例如:

2

输入样例2:

在这里给出一组输入。例如:

8 1 2 3 4 4 3 2 1

输出样例2:

在这里给出相应的输出。例如:

None

 代码段:

#include

int main()
{
	int a[100000];
	int n;
	scanf("%d", &n);
	int z = 0;
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (a[i] != a[j])
			{
				z += 1;
			}
		}
		if (z == n - 1)
		{
			printf("%d", a[i]);
			count += 1;
			break;
		}
		z = 0;
	}
	if (count == 0) printf("None");
	return 0;
}

 7-5 利用二分查找搜寻所有待查找数据

利用二分法在一个有N(N≤20)个元素的有序数列中查找指定值y。找到y后,先输出查找次数,再输出其在数组中对应的下标。若数列中存在多个y,将所有y的位置按下标序号顺序输出;
否则输出“not found”.

输入格式:

输入在第1行中给出1个不大于20的数N。在第2行给出N个数(升序),以空格分隔。最后在第3行给出待查找数据y。

输出格式:

若数列中存在y:先输出查询次数,在其后每行以格式“位置:k”,输出一个位置值。
若数列中没有y:输出“not found”。

输入样例 1:

10
34 56 78 87 87 87 87 112 520 888
87

输出样例 1:

查找次数1
位置:3
位置:4
位置:5
位置:6

输入样例 2:

10
34 56 78 87 87 87 87 112 520 888
80

输出样例 2:

not found

 代码段:

#include 

int main()
{
    int n,a[20],i,num,count1=0,count2=1,left,right,mid;
    scanf("%d\n",&n);
    for(i=0;ia[mid])
            {
                count2++;
                left=mid+1;
                continue;
            }
            else
            {
                printf("查找次数%d\n",count2);
                for(i=0;i

 7-6 判断上三角矩阵

 

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

输入格式:

输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

输入样例:

3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6

输出样例:

YES
NO
NO

代码段:

#include 

int main()
{
    int T, n, i = 0, j = 0;
    scanf("%d", &T);
    for (i = 0; i < T; i++)
    {
        scanf("%d", &n);
        int matix[n][n], flag = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
            {
                scanf("%d", &matix[i][j]);
                if ((i > j) && matix[i][j] != 0)
                    flag = 1;
            }
        if (flag)
            printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

 7-7 方阵循环右移

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:

输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:

按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

输入样例:

2 3
1 2 3
4 5 6
7 8 9

输出样例:

2 3 1 
5 6 4 
8 9 7 

 代码段:

#include 

int main()
{
    int m,n,i,j,step,count;
    scanf("%d %d\n",&m,&n);
    for(i=0;i

 7-8 TicTacToe游戏--胜负判定

井字棋是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏规则:由分别代表O和X的两个游戏者轮流在格子里留下标记。由最先在任意一条直线上成功连接三个标记的一方获胜。(摘抄自百度百科)

2022秋 C理论A_ 编程练习4 - 数组_第1张图片

读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋,现编写程序进行当前胜负的判断,如果X方胜,则显示"X win!",如果O方胜,则显示"O win!",如果无人获胜,则显示"No one win!"。

输入格式:

读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋。

输出格式:

若X方胜,则显示"X win!";若O方胜,则显示"O win!";若无人获胜,则显示"No one win!"。

输入样例1:

X.O
OX.
O.X

输出样例2:

X win!

输入样例2:

O.O
XX.
X..

输出样例2:

No one win!

 代码段:

#include
int main()
{
    char a[4][4];
    int i,xflag=0,oflag=0;
    for(i=0;i<3;i++)
    {
        scanf("%s",a[i]);
    }
    for(i=0;i<3;i++)
    {
        if((a[i][0]==a[i][1])&&(a[i][1]==a[i][2])&&(a[i][0]==a[i][2]))//判断行是否三个相同
        {
            if(a[i][0]!='.')
            {
                if(a[i][0]=='X')
                    xflag=1;
                else
                    oflag=1;
            }
        }
    }
    for(i=0;i<3;i++)
    {
        if((a[0][i]==a[1][i])&&(a[1][i]==a[2][i])&&(a[0][i]==a[2][i]))
        {
            if(a[0][i]!='.')
            {
                if(a[0][i]=='X')
                    xflag=1;
                else
                    oflag=1;
            }
        }
    }
    if(((a[0][0]==a[1][1])&&(a[1][1]==a[2][2])&&(a[0][0]==a[2][2]))||((a[0][2]==a[1][1])&&(a[1][1]==a[2][0])&&(a[0][2]==a[2][0])))
    {
        if(a[1][1]!='.')
        {
            if(a[1][1]=='X')
                xflag=1;
            else
                oflag=1;
        }
    }
    if((xflag==1)&&(oflag==0))
        printf("X win!\n");//xwin
    else if((xflag==0)&&(oflag==1))
        printf("O win!\n");//owin
    else
        printf("No one win!\n");
    return 0;
}

 7-9 2048游戏模拟(2)--向下移位合并

本题模拟2048游戏的规则,提供4X4个格子,输入每个格子的初始值(空白格子值为0),玩家选择向下移动,所有数字向下靠拢,相同的数字相撞时会合并。移动结束后,输出合并后的数值。

输入格式:

分4行,每行输入4个整数,分别表示格子中的初值,数据之间用空格分隔。

输出格式:

分4行,输出移动合并后的数据,每个数之间有一个空格,行末无空格。

输入样例:

2 0 2 2
2 2 4 4
0 2 0 2
4 0 0 4

输出样例:

0 0 0 2
0 0 0 4
4 0 2 2
4 4 4 4

代码段:

#include 

int main()
{
	int i,j,a[4][4],temp,k,count;
	
    for(i=0;i<4;i++)    //2048数组初始输入 
        for(j=0;j<4;j++)
            scanf("%d",&a[i][j]);
    
	for(k=0;k<=3;k++)    //把0与非0元素交换 
	{
		for(j=0;j<=3;j++)
		{
			for(i=0;i<=3-j;i++)
			{
				if(a[i][k]==0&&i-1>=0)
				{
					temp=a[i][k];
					a[i][k]=a[i-1][k];
					a[i-1][k]=temp;
				}
			}	
		}
	}
	
	for(k=0;k<=3;k++)    //将相同元素合并 
	{
		for(i=3;i>=0;i--)
		{
			if(a[i][k]==a[i-1][k])
			{
				a[i][k]+=a[i-1][k];
				a[i-1][k]=0;
			}
		}
	}
	
	for(k=0;k<=3;k++)    //把0与非0元素交换 
	{
		for(j=0;j<=3;j++)
		{
			for(i=0;i<=3-j;i++)
			{
				if(a[i][k]==0&&i-1>=0)
				{
					temp=a[i-1][k];
					a[i-1][k]=a[i][k];
					a[i][k]=temp;
				}
			}	
		}
	}
	
	for(k=0;k<=3;k++)    //输出
	{
		for(i=0;i<=3;i++)
		{
			if(count!=3)
			{
				printf("%d ",a[k][i]);
				count++;
			}
            else
		    {
			    printf("%d\n",a[k][i]);
			    count=0;
		    }
		}
	}
}

 7-10 二进制数据转换成十进制数

输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。

输入格式:

输入1个二进制数串(至少1位且不超过16位)。

输出格式:

输出转换后的十进制数。

输入样例:

0110110001100

输出样例:

3468

 代码段:

#include 
#include 
#include 
int main()
{
    char a[17];
    gets(a);
    int n,sum=0;
    n=strlen(a);
    for(int i=n-1,k=0;i>=0;i--,k++){
        sum+=(a[i]-48)*pow(2,k);
    }
    printf("%d",sum);
    return 0;
 }

7-11 英文单词排序

 

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:

输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:

输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple
#

输出样例:

red blue green yellow purple 

代码段:

#include
#include

int main(void)
{
  char str[20][11];
  int i=0;
  while (1)
  {
      scanf("%s",str[i]);
      if (str[i][0]=='#')
        break;
      i++;
  }

  int len=i;
  int j,k;
  char temp[11];
  
  for (j=0; j<=len-1; j++)
  {
    for (k=0; kstrlen(str[k]))
        {
            strcpy(temp,str[k]);
            strcpy(str[k],str[k-1]);
            strcpy(str[k-1],temp);
        }
    }
  }

  for (j=0; j<=len-1; j++)
  {
      printf("%s ",str[j]);
  }
  return 0;
}

 7-12 统计单词的长度

本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:

输入给出一行字符。

输出格式:

在一行中输出每个单词的长度。每个数字后有一个空格。

输入样例:

How are you?

输出样例:

3 3 4 

 代码段:

#include
int main()
{
	char ch;
	int len=0,isword=0,allspace=1;
	while((ch=getchar())!='\n')
	{
		if(ch==' ')
		{
			if(isword)
			{
				printf("%d ",len);
				isword=0;
				len=0;	
			}
		}
		else
		{
				if(!isword)
				{
					isword=1;
				}
				len++;
				allspace=0;
				
		}
	
	}
	
	
	if(isword)printf("%d ",len);
	if(allspace)printf("0 ");
	return 0;
}

7-13 来验证我们的身份证吧

咱们的身份证号码由18位字符组成,其中17位为地区、日期编号和顺序编号,最后1位为校验码。

校验码的计算规则如下:

  1. 首先求出前17位数字的加权和S,权重分配按顺序为:{ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
  2. 然后将计算的和S对11取模得到值Z;
  3. 最后按照以下关系对应Z值与校验码M的值:

Z: 0 1 2 3 4 5 6 7 8 9 10

M:1 0 X 9 8 7 6 5 4 3 2

例如:对于身份证号420111200001014148,按权重累加和S为:

4×7+2×9+0×10+1×5+......+4×8+1×4+4×2=125

由此计算 Z=S % 11=4

对应的M值为 8 ,即校验位值为8,与输入的身份证号最后一位相同,故上述身份证号正确。若M值与身份证最后一位不同,则身份证号有问题。

本题给出一些身份证号码,请你验证校验码是否正确。若身份证号有问题,则输出该号码。

输入格式:

第1行输入需判断的身份证号码条数N(0

输出格式:

每行输出一条不正确的身份证号。

若全部正确,输出"全部正确!"。

输入样例 1:

3
420106197107251007
310111196602231020
602402200311154723

输出样例 1:

全部正确!

输入样例 2:

2
42010619710725100X
220111196302231027

输出样例 2:

42010619710725100X

 代码段:

#include 
#include 
#define ID_Len 18
int main()
{
    int N;
    scanf("%d",&N);
    int weight[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char ID[19];
    char M[11]= {'1','0','X','9','8','7','6','5','4','3','2'};
    int flag=1;
    for(int i=0; i

 7-14 将整数按三位分节

编写一个程序,将某个位数不确定的非负整数进行三位分节后输出。程序保证数据是不超过4个字节的正整数。

输入格式:

输入一个非负整数,以回车结束输入。

输出格式:

将这个正整数每隔3位就用逗号分隔,然后输出。

输入样例:

1234567

输出样例:

1,234,567

代码段:

#include 
int main()
{
    int a,i;
    char s[30] = "";
    scanf("%d",&a);
    i = 0;
    while(1) 
    {
        s[i] = a%10 + '0';
        a = a/10;
        if(a==0) 
	    {
			break;
		}
        i++;
    }
    printf("%c",s[i--]);
    for(i;i>=0;i--)
    {
 
        if((i+1)%3== 0) /* i+1是是单个数字在数字字符串的位置,因为上面i是从0开始的*/
        {
            printf(",%c",s[i]);
        }
        else
        {
            printf("%c",s[i]);
        }
    }
 
    return 0;
}

 7-15 求完全对称日

刚进入2020年,网上就流传着2020.02.02是“千年一遇”的对称日(正着读反着读都一样),很多情侣准备选择这一天去登记结婚。事实上,像这样的完全对称日还有很多。
现在来编写一个程序,输入2个年份M、N(1000<=M<=N<=9999),输出M和N之间(包含M、N)的所有完全对称日。如果没有完全对称日,则输出"None"。

输入格式:

输入2个年份M、N(1000<=M<=N<=9999)。

输出格式:

按“年.月.日”的格式输出该年所有的完全对称日。其中年按4位输出,月、日均按2位输出,位数不足则加前导0。每行输出一个完全对称日。

输入样例:

2011 2020

输出样例:

2011.11.02
2020.02.02

代码段:

#include
#include
#include
int main()
{
   long int A[1000]={0},B[1000]={0},C,D,E,sum=0,real=0,A1;
   int m,n;
   scanf("%d %d",&m,&n);
   for(int q=m;q<=n;q++)
   {

       for(int w=1;w<=12;w++)
       {
           if(w==1||w==3||w==5||w==7||w==8||w==10||w==12)
           {
                for(int e=1;e<=31;e++)
                {
                    A1=q*10000;
                     if(w<10)
                    A1=A1+w*100;
                    if(w>=10)
                    A1=A1+w*100;
                    A1=A1+e;
                    C=A1;
            for(int o=1;;o++)
            {
            A[o]=C%10;
            C=C/10;
            D=o;
            if(C==0)
                break;
            }
            E=D;
            for(int o=1;o<=D;o++)
            {

              for(int t=(E-o);t>0;t--)
            {
                A[o]=A[o]*10;
            }
            real=real+A[o];
            }
            if(real==A1)
            {
                sum=sum+1;
                printf("%d.%02d.%02d\n",q,w,e);
            }
            real=0;

           }
           }
        else
           {    int z=30;
               if(q%4!=0&&w==2)
                z=28;
               for(int e=1;e<=z;e++)
               {
                    A1=q*10000;
                     if(w<10)
                    A1=A1+w*100;
                    if(w>=10)
                    A1=A1+w*100;
                    A1=A1+e;
                    C=A1;
            for(int o=1;;o++)
            {
            A[o]=C%10;
            C=C/10;
            D=o;
            if(C==0)
                break;
        }
        E=D;
     for(int o=1;o<=D;o++)
     {

              for(int t=(E-o);t>0;t--)
            {
                A[o]=A[o]*10;
            }
            real=real+A[o];
     }
        if(real==A1)
            {
                sum=sum+1;
                printf("%d.%02d.%02d\n",q,w,e);
                }
        real=0;

           }

       }
   }
   }
   if(sum==0)
   	printf("None");
    return 0;
}

 

你可能感兴趣的:(武理题库,c语言,算法,排序算法)