课程中C的练习题集合第二集(35~54)

       这是我大一C语言课OJ的练习题,这节为35~54道.记录一下,无关难易。

35、使用函数验证哥德巴赫猜想

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。

输入两个正整数mn0<=m<=n<=100),将mn之间的偶数表示成两个素数之和,输出时每行显示5组。要求定义并调用函数primem)判断m是否为素数,当m为素数时返回1,否则返回0

输入-两个正整数mn0<=m<=n<=100

输出-见样例

输入样例1    89 100

输出样例1

90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79

100=3+97

代码实现:

#include<stdio.h>
#include<math.h>
int prime(int m)
{
    int i;
    if(m<2)
    	return 0;
    for(i=2;i<=sqrt(m);i++)
	{
        if(m%i == 0)
        	return 0;
    }
    return 1;
}
int main(){
    int i,j,m,n,k;
    scanf("%d %d",&m,&n);
    if(m%2==1)
		m=m+1;
    if(m<6)
		m=6;
    k=0;
    for(i=m;i<=n;i+=2)
	{
        for(j=2;j<i;j++){
            if(prime(j)&&prime(i-j))
			{
                printf("%d=%d+%d",i,j,i-j);
                break;
            }
        }
        k++;
        if(k%5 == 0)
            printf("\n");
        else
			printf(", ");
    }
	return 0;
}

36、亲和数

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110284
284的所有真约数为12471 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。如果两个数相等,则认为它们不是亲和数。
编写一个函数,判断给定的两个数是否是亲和数。

输入

测试次数t

每组测试数据一行,包含两个整数AB 其中 0 <= A,B <= 600000 ;

输出

对于每组测试实例,如果AB是亲和数的话输出YES,否则输出NO

输入样例

3

220 284

28 28

10000 3000

输出样例1

YES

NO

NO

#include<stdio.h>
int main()
{
    int t,A,B;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&A,&B);
        int i,sum1=0,sum2=0;
        for(i=1;i<A/2+1;i++)
        {
            if(A%i==0)
                sum1+=i;
        }
        for(i=1;i<B/2+1;i++)
        {
            if(B%i==0)
                sum2+=i;
        }
        if(sum1==B&&sum2==A&&A!=B)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

37、欧拉函数

在数论中,欧拉函数f(n)被定义为:小于等于n的正整数中和n互质的数的数目(互质即两者最大公约数为1

f(1)=1,因为与小于等于1的数中与1互质的数只有1

再如f(8)=4,因为小于等于8中的数与8互质的数有1,3,5,7,而28最大公约数为248最大公约数为468最大公约数为2

现在给定一个数n,求f(n)的值

要求定义并调用函数f(n),返回欧拉函数的值

输入  测试样例有多组,第一行输入一个整数T,代表测试组数

接下来的每一行输入一个整数n,代表需要计算f(n)n

输出  对于每组测试样例,各输出一行,其中包括一个整数f(n)

输入样例

3

1

4

8

输出样例1

1

2

4

#include<stdio.h>
#include<math.h>
int gcd(int a,int b)
{
    int N;
    N=a%b;
    while(N){
        a=b;
        b=N;
        N=a%b;
    }
    return b;
}
int f(int X)
{
    int i=0,j=0;
    for (j=1;j<=X;j++)
    	if(gcd(j,X)==1)
		{
			i++;
		}
    return i;
}
int main()
{
    int m,n;
    scanf("%d",&m);
    for (int i=0; i<m;i++)
	{
        scanf("%d",&n);
        printf("%d\n",f(n));
    }
}

 38、空心的数字金字塔

题目描述

本题要求实现一个函数,输入一个正整数n1<=n<=9)输出n行空心的数字金字塔。要求定义和调用函数hollow_pyramid(n)打印出n行空心的数字金字塔。

输入

正整数n1<=n<=9)

输出

输入样例1 <-复制

5

输出样例1

        1

     2     2

    3       3

  4          4

555555555

代码实现:

#include<stdio.h>
void hollowPyramid(int n);
int main()
{
	int n;
	scanf("%d",&n);
	hollowPyramid(n);
	return 0;
}
void hollowPyramid(int n)
{
	int a,b,c,d;
	for(a=1;a<=n;a++){
		for(b=n-a;b>0;b--){
			printf(" ");
		}
		printf("%d",a);
        if(a==1)
        	printf("\n");
        if(a>=2&&a<n)
      	{
       		for(c=0;c<2*a-3;c++)
       		{
       			printf(" ");
			}
			printf("%d\n",a);
		}
	}
	a=a-1;
	if(a==n)
	{
		for(d=0;d<2*n-2;d++)
		{
			printf("%d",a);
		}	
	}
	return 0;
}

39、使用函数统计指定数字的个数

题目描述

本题要求实现一个统计整数中指定数字的个数的简单函数:输入两个整数numberdigit0<=digit<=9),统计并输出整数number中数字digit的个数。

要求定义并调用函数countdigitnumberdigit),它的功能是统计整数number中数字digit的个数。例如countdigit100900)的返回值是3

输入

两个整数numberdigit0<=digit<=9)

 

输出

见样例

输入样例<-复制

-21252 2

输出样例1

Number of digit 2 in -21252: 3

代码实现:

#include<stdio.h>
int countdigit(int number,int digit);
int main()
{
	int number,digit;
	scanf("%d%d",&number,&digit);
	printf("Number of digit %d in %d: %d",digit,number,countdigit(number,digit));
	return 0;
}
int countdigit(int number,int digit)
{
	int n=0;
	if(number<0)
		number=-number;
	do
	{
		if(number%10==digit){
			n++;	
		}
		number=number/10;
	}
	while(number%10!=0);
	return n;
}

40、使用函数输出指定范围内的                Fibonacci数

题目描述

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数mn0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

要求定义并调用函数fibn),它的功能是返回第nFibonacci数。例如fib7)返回值是13。定义并调用函数print_fnmn)输出给定范围[m,n]内的所有Fibonacci数,相邻数字间有一个空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”

输入

两正整数m和n(0<m≤n≤10000)

输出

见样例

输入样例<-复制

20 100

输出样例1

21 34 55 89

代码:

#include<stdio.h>
void PrintFN(int m,int n);
int fib(int n);

int main()
{
    int m,n,t;
    scanf("%d %d", &m,&n);
    PrintFN(m, n);
    return 0;
}
int fib(int n)
{
    int a=1,b=1,s=0,q;
    if(n==1) 
	return 1;
    else if(n==2) 
	return 1;
    else
    {
        n=n-2;
        while(n--)
        {
            s=a+b;
            q=b;
			b=s;
			a=q;
        }
    }
    return s;
}
void PrintFN(int m,int n)
{
    int x=1,y,time=0;
    for(y=fib(x);y<=n;x++) 
    {
        y=fib(x);
        if(y<=n&&y>=m) 
        { 
    time++;
        if(time==1)
		printf("%d",y); 
        else 
		printf(" %d",y);  
        }  
    }
    if(time==0) 
	puts("No Fibonacci number");
}

41、勤奋的大佬(循环)

题目描述

大佬每天都会到软工的实验室(7楼)学习,一天去三次。软工有两部电梯,其中有一部电梯每隔x天维修一次,(维修期间,电梯一整天都不工作),另一部电梯每隔y天维修一次,如果同一天两部楼梯都在维修期间,大佬只能爬楼梯,他想知道从第1天到第n天一共走了多少层楼梯?(设第0天两部电梯都在维修)

输入

第一行包含t组测试数据(t<=150 每组测试输入3个数字xyn0<=x<=1000 , 0<=y<=1000 , n<=1e9)

输出

输出走了多少层楼梯。

输入样例<-复制

2

1  1  2

2  3  6

输出样例1

36

0

代码实现:

#include<stdio.h>
int main()
{
    int x,y,n,t,a,b,i,j,k,count=0;
    scanf("%d",&t);
    
    for(j=1;j<=t;j++){
    scanf("%d%d%d",&x,&y,&n);
    for(i=1;i<=n;i++)
    {
        a=i%x;
        b=i%y;
        if(a==0&&b==0)
            count++;
    }
    k=(count-1)*36;
    printf("%d\n",k);
    count=0;
    }
    return 0;
}

42、字符合并

题目描述

给定一串字符序列(以#结束),按照单词将字符合并。合并后每个大写字母前有一个空格,第一个字符前没有空格,最后一个字符后没有空格。请输出包含不超过N个合并后字符的序列

注意:如果N大于合并后(包括两个单词之间保留的空格)的字符个数,则输出完整的字符序列,否则只输出N个合并后的字符就停止

输入

输出一个正整数N

输入字符数据,并保证在#之前不会出现换行符\n

输出

最多输出N个合并后的字符序列

输入样例1 <-复制

15

H o  wA r e   Y o u  #

输出样例1

How Are You

代码实现:

#include<stdio.h>
int main(){
    int N,m=1;
    char arr1;
    char arr2;
    char arr3;
    char arr4;
    char arr5;
    char ch;
    scanf("%d",&N);
    while (N>0 && ch!='#')
    {
        ch=getchar();
        if(m==1&&(ch>='A')&&(ch<='Z')) 
            putchar(ch);
        else if((ch>='A')&&(ch<='Z'))
        {
            putchar(' ');
            N--;
            putchar(ch);
        }
        else if((ch>='a')&&(ch<='z'))
            putchar(ch);
        else if(N==0)
            break;
        else 
            continue;
        N--;
        m++;
    }
    return 0;
}

43、简化的插入排序

题目描述

本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

输入

输入在第一行先给出非负整数N<=10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X

输出

在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。

输入样例<-复制

5

1 2 4 5 7

3

输出样例1

1 2 3 4 5 7

#include <stdio.h>
int main()
{
	int N,X,i,j;
	scanf("%d",&N);
    int a[N+1];
	for(i=0;i<N;i++)
	scanf("%d",&a[i]);
	scanf("%d",&X);
 	for(i=0;i<N;i++) 
		if(a[i]>X)
    		break;
	for(j=N-1;j>=i;j--)
		a[j+1]=a[j];
	a[i]=X;
	for(i=0;i<N+1;i++)
	printf("%d ",a[i]);
    return 0;
}

C++版本:


#include<iostream>
using namespace std;
int main() {
    int numberl[11] = { 1,2,3,4,5,6,7,8,9,11 };
    int N, temp;
    cout << "请输入你要插入的数字:" << endl;
    cin >> N;
    //第一步查找位置
    for (int i = 0; i < 10; i++) {
        //1如果N是介于数组中两个数的中间,则i+1就是m放入数组对应的位置
        if (N > numberl[i] && N < numberl[i + 1]) {//1
            temp = i + 1;//2
            break;
        }
    }
    //从temp开始到number[],倒叙逐个将数组元素向后移动1位
    for (int i = 10; i >= temp; i--) {
        numberl[i + 1] = numberl[i];
    }
    numberl[temp] = N;//将N放入数组索引temp处
    cout << "插入后的数组为:";
    for (int i = 0; i <= 10; i++) {
        cout << numberl[i] << " ";
    }
}


44、交换最小值和最大值

题目描述

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

注意:题目保证最大和最小值都是唯一的。

输入

输入在第一行中给出一个正整数N≤10),第二行给出N个整数,数字间以空格分隔。

输出

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例<-复制

5

8 2 5 1 4

输出样例1

1 2 5 4 8

#include <stdio.h>
int main()
{
	int N,i,m;
	scanf("%d",&N);
	int a[N];
	for(i=0;i<N;i++)
		scanf("%d",&a[i]);
	int min,max;
 	min=a[0];
 	for(i=1;i<N;i++)
  		if(a[i]<min)
  		{
   			min = a[i];
   			m=i;
  		} 
 	a[m]=a[0];
 	a[0]=min;
	max=a[0];
	for(i=1;i<N;i++)
  		if(a[i]>max)
  		{
   			max = a[i];
   			m=i;
  		}
 	a[m]=a[N-1];
 	a[N-1]=max;
 	for(i=0;i<N;i++)
  		printf("%d ",a[i]);
}

45、求一批整数中出现最多的各位数字

题目描述

给定一批整数,分析每个整数的每一位数字,求出现次数最多的各位数字。例如给定3个整数123423453456,其中出现最多次数的数字是34,均出现了3次。

输入

输入在第1行中给出正整数N1≤N≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。

输出

在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1n2……为出现次数最多的各位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

输入样例<-复制

3

1234 2345 3456

输出样例1

3: 3 4

代码实现:

#include <stdio.h>
int main()
{
    int a[10]={0};
    int k,m,n,N,q,max;
    max=0;
    scanf("%d",&N);
    for(m=0;m<N;m++)
    {
        scanf("%d",&q);
        if(q==0)
        {
            a[0]+=1;
        }
        for(;q>0;)
        {
            n=q%10;
            for(k=0;k<10;k++)
            {
                if(n==k)
                {
                    a[k]+=1;
                }
            }
            q=q/10;
        }
    }
    for(m=0;m<10;m++)
    {
        if(a[m]>=max)
            max=a[m];
    }
    printf("%d:",max);
    for(m=0;m<10;m++)
    {
        if(a[m]==max)
        {
            printf(" %d",m);
        }
    }
    return 0;
}

46、找出不是两个数组共有的元素

题目描述

给定两个整型数组,本题要求找出不是两者共有的元素。

输入

输入分别在两行中给出两个整型数组,每行先给出正整数N≤20),随后是N个整数,其间以空格分隔。

输出

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例<-复制

10 3 -5 2 8 0 3 5 -15 9 100

11 6 4 8 2 6 -5 9 0 100 8 1

输出样例1

3 5 -15 6 4 1

代码实现:

#include<stdio.h>
int main(){    
	int a[21],b[21],c[21];    
	int N,M,i,j,t=0,n=0;
	scanf("%d",&N);    
	for(i=0;i<N;i++)
		scanf("%d",&a[i]);        
	scanf("%d",&M);    
	for(i=0;i<M;i++)
		scanf("%d",&b[i]);       
	for(i=0;i<N;i++){        
		for(j=0;j<M;j++)            
			if(a[i]==b[j])break;	        
		if(j==M){            
			c[n]=a[i];            
			n++;        
		}    
	}	        	
	for(i=0;i<M;i++){        
		for(j=0;j<N;j++)            
			if(b[i]==a[j])
				break;	        
		if(j==N){            
			c[n]=b[i];            
			n++;        
		}    
	}      
	for(i=0;i<n;i++){        
		for(j=0;j<i;j++)            
			if(c[i]==c[j])break;		        
		if(j==i){            
			if(t!=0)printf(" ");            	
			printf("%d",c[i]);            
			t++;        
		}       
	}    
	return 0;   
}

47、求整数序列中出现次数最多的数

题目描述

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入

输入在一行中给出序列中整数个数N0<N≤1000),以及N个整数。数字间以空格分隔。

输出

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例<-复制\

10 3 2 -1 5 3 4 3 0 3 2

输出样例1

3 4

代码实现:

#include <stdio.h>
int main()
{
    int N,a[1000],b[1000];
    scanf("%d",&N);
    for(int m=0;m<N;m++)
    {
        scanf("%d",&a[m]);
        b[m]=0;
    }
    for(int m=0;m<N;m++)
    {
        for(int n=0;n<N;n++)
        {
            if(a[m]==a[n]) 
				b[m]++;
        }
    }
    int max=b[0],t=0;
    for(int m=1;m<N;m++)
    {
        if(b[m]>max) 
        {
            max=b[m];
            t=m;
        }
    }
    max=b[t];
    printf("%d %d",a[t],max);
    return 0;
}

48、组个最小数

题目描述

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558

现给定数字,请编写程序输出能够组成的最小的数。

输入

输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出

在一行中输出能够组成的最小的数。

输入样例<-复制

2 2 0 0 0 3 0 0 1 0

输出样例1

10015558

#include<stdio.h>
int main()
{
	int m,n;
	int s[15];
	for(m=0;m<10;m++)
		scanf("%d",&s[m]);
	for(m=1;m<10;m++)
	{
		if(s[m]!=0)
		{
			printf("%d",m);
			s[m]--;
			break;
		}
	}
	for(m=0;m<10;m++)
	{
		for(n=s[m];n>0;n--)
		{
			if(s[m]!=0)
				printf("%d",m);
		}
	}
	return 0;
}

49、判断上三角矩阵

题目描述

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

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

输入

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

输出

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

输入样例1 <-复制

2

3

1 2 3

0 4 5

0 0 6

2

1 0

-8 2

输出样例1

YES

NO

代码实现:

#include <stdio.h>
int main()
{
    int T,n,i,b,q;
    scanf("%d",&T);
    for(q=0;q<T;q++)
    {
        int w=0;
        scanf("%d",&n);
        int a[16][16];
        for(i=0;i<n;i++)
        {
            for(b=0;b<n;b++) 
			scanf("%d",&a[i][b]);
        }
        for(i=0;i<n;i++)
        {
            for(b=0;b<i;b++)
            {
                if(a[i][b]!=0)
				{			
					w=1;
                    break;
                }
            }
        }
        if(w==1) 
			printf("NO\n");
        if(w==0) 
			printf("YES\n");
    }
    return 0;
}

50、打印杨辉三角

题目描述

本题要求按照规定格式打印前N行杨辉三角。

输入

输入在一行中给出N1≤N≤10)。

输出

以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。

输入样例<-复制 6

输出样例1

        1\n
       1   1\n
      1   2   1\n
     1   3   3   1\n
    1   4   6   4   1\n
   1   5  10  10   5   1

#include<stdio.h>

int main(){
	int N;
	scanf("%d",&N);
	
	int a[N][N];
	for(int i=0; i<N; i++){
		a[i][0]=1;
		a[i][i]=1;
	}
	for(int j=2; j<N; j++){
		for(int b=1; b<j; b++){
			a[j][b]=a[j-1][b-1]+a[j-1][b];
		}
	}
	int k=N;
	for(int i=0; i<N; i++){
		int b=k-1;
		while(b>0){
			printf(" ");
			b--;
		}
		
		for(int j=0; j<=i; j++){
			int z=a[i][j];
			int n=0;
			while(z!=0){
				z/=10;
				n++;
			}
			for(int l=0; l<4-n; l++) printf(" ");
			
			printf("%d",a[i][j]);
		}
		if(i!=N-1) printf("\n");
		k--;
	}

	return 0;
}

51、方阵循环右移

题目描述

本题要求编写程序,将给定n×n方阵中的每个元素循环在该行内右移m个位置。

输入

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

输出

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

输入样例<-复制

 

2 3

1 2 3

4 5 6

7 8 9

输出样例1

2 3 1

5 6 4

8 9 7

代码实现:

#include<stdio.h>
int main()
{
	int a[6][6],b[6][6];
	int i,j;
	int m,n;
	scanf("%d%d",&m,&n);
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			scanf("%d",&a[i][j]);
	m=m%n;
	if(m==0){
		for(i=0;i<n;i++){
			for(j=0;j<n;j++)
				printf("%d",a[i][j]);
				if(i<n-1)
					printf("\n");
		}	
	}
	else{
		while(m--){
			for(i=0;i<n;i++)
				b[i][1]=a[i][2];
			for(i=0;i<n;i++)
				b[i][0]=a[i][n-2];
			for(i=0;i<n;i++)
				b[i][2]=a[i][0];
			for(i=0;i<n;i++)
				for(j=0;j<n;j++)
					b[i][j]=b[i][j];
		}
		for(i=0;i<n;i++){
			for(j=0;j<n;j++)
				printf("%d ",b[i][j]);
				if(i < n-1)
					printf("\n");
						
		}
	}
}

52、找鞍点

题目描述

一个矩阵元素的鞍点是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入

输入第一行给出一个正整数n1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出

输出在一行中按照行下标 列下标(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例<-复制

4

1 7 4 1

4 8 3 6

1 6 1 2

0 7 8 9

输出样例1   2 1

#include<stdio.h>
int main()
{
	int n,i,j;
	scanf("%d",&n);
	int a[n][n];
	for(i=0;i<n;i++)  
        {
	    for(j=0;j<n;j++)
		scanf("%d",&a[i][j]);	
	}
	int r=0,l=0,f=0;	 
	for(i=0;i<n;i++)    
	{
	    for(j=0;j<n;j++)
	    {
	        if(a[i][j]>=a[i][l])	 
			{
				l=j;
			}	
	    }
	    f=1;
	    for(r=0;r<n;r++)   
	    {
			if(a[r][l]<a[i][l])  
			{
    	        f=0;
                break;
                }
	    }
	    if(f)
	    {
			break;
	    }	
	}
	if(f)      
	    printf("%d %d",i,l);
    else         
	    printf("NONE");	
}

53、螺旋方阵

题目描述

所谓螺旋方阵,是指对任意给定的N,将1N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入

输入在一行中给出一个正整数N<10)。

输出

输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例<-复制 5

输出样例1

  1  2  3  4  5\n
 16 17 18 19  6\n
 15 24 25 20  7\n
 14 23 22 21  8\n
 13 12 11 10  9

代码实现:

#include<stdio.h>
int main(){
    int n,m,i=0,c=0;
    scanf("%d",&n);
    int l=0,s=n-1;    
    int a[n][n];
    while(l<=s){       
        for(m=l;m<=s;m++) 
			a[l][m]=++c;
        for(i=l+1;i<=s;i++) 
			a[i][s]=++c;
        for(m=s-1;m>=l;m--) 
			a[s][m]=++c;
        for(i=s-1;i>l;i--) 
			a[i][l]=++c;
        l++;
		s--;
    }
    
    for(i=0;i<n;i++){
        for(m=0;m<n;m++)
           printf("%3d",a[i][m]);
        printf("\n");
    }}

54、简易连连看

题目描述

本题要求实现一个简易连连看游戏模拟程序。

给定一个2n*2n的方阵网格游戏盘面,每个格子中放置一些符号。这些符号一定是成对出现的,同一个符号可能不止一对。程序读入玩家给出的一对位置(x1,y1)(x2,y2),判断这两个位置上的符号是否匹配。如果匹配成功,则将两个符号消为“*”并输出消去后的盘面;否则输出“Uh-oh”。若匹配错误达到3次,则输出“Game Over”并结束游戏。或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。

输入

输入在一行中给一个正整数N<5)。随后2N行,每行2N个大写英文字母(其间以1个空格分隔),表示游戏盘面。盘面之后给出一个正整数K,随后K行,每行按照格式“x​1​​y​1​​x​2​​y​2​​”给出一个玩家的输入。注意格子的行、列编号是从12N

输出

根据玩家的每一步输入,输出相应的结果。输出盘面时注意,每行字符间以1个空格分隔,行末不得有多余空格。

输入样例<-复制

2

I T I T

Y T I A

T A T Y

I K K T

11

1 1 1 3

4 2 4 3

3 1 4 2

2 2 1 2

3 1 2 4

4 4 3 1

2 1 3 4

3 3 1 4

4 1 2 3

2 4 3 2

1 1 2 2

输出样例1

* T * T

Y T I A

T A T Y

I K K T

* T * T

Y T I A

T A T Y

I * * T

Uh-oh

* * * T

Y * I A

T A T Y

I * * T

Uh-oh

* * * T

Y * I A

* A T Y

I * * *

* * * T

* * I A

* A T *

I * * *

* * * *

* * I A

* A * *

I * * *

* * * *

* * * A

* A * *

* * * *

Congratulations!

代码实现:

#include<stdio.h>
int main(void)
{
	char ch[10][10];
	int m,n,s,N,a,b,g,k,flag=1,h,c1=0,c2=0;
	scanf("%d",&N);
	getchar();
	for(a=1;a<=2*N;a++)
	for(b=1;b<=2*N;b++){
		ch[a][b]=getchar();
		getchar();
	}
	scanf("%d",&s);
	for(a=0;a<s;a++){
		scanf("%d%d%d%d",&m,&n,&g,&k);
		if(ch[m][n]==ch[g][k]&&ch[m][n]!='*'){
			ch[m][n]='*';
			ch[g][k]='*';
			flag=0; 
		}
		if(!flag)
		for(b=1;b<=2*N;b++)
		for(h=1;h<=2*N;h++){
			printf("%c",ch[b][h]);
			 if(h==2*N)
			 printf("\n");
			 else printf(" ");
		}
		else{
		printf("Uh-oh\n");c1++;
		}
		if(c1>=3){
			printf("Game Over\n");
			break;
			}
		for(b=1;b<=2*N;b++)
		for(h=1;h<=2*N;h++){
			if(ch[b][h]!='*') 
			c2++;
		}
		if(c2==2){
			printf("Congratulations!\n");
		break;
		}
		flag=1;
		c2=0;
	}
	return 0;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值