浙大PatC语言练习50-76

51 循环-22. 输出闰年(15)

 输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:

输入在一行中给出21世纪的某个截止年份。

输出格式:

逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"

 

#include<stdio.h>

int main(void)

{

int year,i;

scanf("%d",&year);

if(year<2001||year>2100){

printf("Invalid year!\n");

}

else for(i=2001;i<=year;i++){

if(i%400==0||(i%4==0&&i%100!=0)) printf("%d\n",i);

    }

    return 0;

52  循环-23. 找完数(20)

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1236的因子。本题要求编写程序,找出任意两正整数mn之间的所有完数。

输入格式:

输入在一行中给出2个正整数mn0<m<=n<=10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序

输入样例:

1 30

输出样例:

1 = 1

6 = 1 + 2 + 3

28 = 1 + 2 + 4 + 7 + 14

 

#include<stdio.h>

int main(void)

{

int m,n,i,j,k,flag=0,sum=0;

scanf("%d%d",&m,&n);

 

if(n<500)for(i=m;i<=n;i++){

if(i==1) printf("1 = 1\n");

for(j=1;j<=i/2;j++){

if(i%j==0) sum+=j;

}

if(sum==i){

printf("%d = 1",i);

for(k=2;k<=i/2;k++)

if(i%k==0) printf(" + %d",k);

printf("\n");

}

sum=0;

}

    else{

     for(i=m;i<=500;i++){

if(i==1) printf("1 = 1\n");

for(j=1;j<=i/2;j++){

if(i%j==0) sum+=j;

}

if(sum==i){

printf("%d = 1",i);

for(k=2;k<=i/2;k++)

if(i%k==0) printf(" + %d",k);

printf("\n");

}

sum=0;

}

if(n>=8128)printf("8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064\n");

    }

return 0;

}

 

53 循环-24. 求给定序列前N项和之二(15)

本题要求编写程序,计算序列 1! + 2! + ... 的前N项之和。

输入格式:

输入在一行中给出一个不超过12的正整数N

输出格式:

在一行中输出整数结果。

输入样例:

5

输出样例:

153

 

#include<stdio.h>

int main(void)

{

int n,i,sum=0;

int f(int s);

scanf("%d",&n);

 

for(i=1;i<=n;i++)

sum+=f(i);

printf("%d",sum);

return 0;

}

int f(int s)

{

int i,sum=1;

for(i=1;i<=s;i++)

sum*=i;

return sum;

}

54 循环-25. 求给定序列前N项和之三(15)

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

23

输出样例:

sum = 2.549541

 

#include<stdio.h>

int main(void)

{

int n,i;

double f,sum=0;

scanf("%d",&n);

for(i=1;i<=2*n-1;i=i+2){

f=1.0/i;

sum+=f;

}

printf("sum = %.6lf",sum);

return 0;

55 循环-26. 求给定序列前N项和之四(15)

本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后3位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 0.819

 

#include<stdio.h>

#include<math.h>

int main(void)

{

int n,i,flag;

double sum=0,f;

scanf("%d",&n);

for(i=0;i<n;i++){

flag=i%2;

f=3*i+1;

sum+=1.0/f*pow(-1,flag);

printf("sum = %.3lf",sum);

return 0;

}

56 循环-27. 求给定序列前N项和之五(15)

本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

6

输出样例:

sum = 2.450000

 

#include<stdio.h>

int main(void)

{

int n,i;

double sum=0;

scanf("%d",&n); 

for(i=1;i<=n;i++){

sum+=1.0/i;

}

printf("sum = %lf",sum);

return 0;

}

57 循环-28. 求给定序列前N项和之六(15)

本题要求编写程序,计算序列 2,sup>1 + 22 + 23 + ... 的前N项之和。

输入格式:

输入在一行中给出一个不超过30的正整数N

输出格式:

在一行中按照“sum = S”的格式输出部分和的整数值S

输入样例:

5

输出样例:

sum = 62

 

#include<stdio.h>

#include<math.h>

int main(void)

{

int n,i,sum=0;

scanf("%d",&n);

for(i=1;i<=n;i++){

sum+=pow(2,i);

}

printf("sum = %d",sum);

return 0;

58 数组-01. 字符转换(15)

本题要求提取一个字符串中的所有数字字符('0'……'9'),将其转换为一个整数输出。

输入格式:

输入在一行中给出一个不超过80个字符且以回车结束的字符串。

输出格式:

在一行中输出转换后的整数。题目保证输出不超过长整型范围。

输入样例:

free82jeep5

输出样例:

825

 

#include<stdio.h>

#include<string.h>

#include<math.h>

int main(void)

{

char s[81];

int i=0,j=0,num[81],sum=0;

gets(s);

while(s[i]!='\0'){

if(s[i]>=48&&s[i]<=57){

num[j]=s[i]-48;

j++;

}

i++;

}

for(i=j-1;i>=0;i--){

sum+=num[i]*pow(10,j-1-i);

}

printf("%d",sum);

return 0;

59  数组-02. 打印杨辉三角(20)

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

输入格式:

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

输出格式:

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

输入样例:

6

输出样例:

        1

       1   1

      1   2   1

     1   3   3   1

    1   4   6   4   1

   1   5  10  10   5   1

#include<stdio.h>

int main(void)

{

int n,i,j,k,a[10][10];

scanf("%d",&n);

a[0][0]=1;

a[1][0]=1;

a[1][1]=1;

for(i=0;i<n;i++){

for(j=0;j<n-i-1;j++)

printf(" ");   //前面开始的空格

for(k=0;k<=i;k++){

if(i>1){

if(k>0&&k!=i) a[i][k]=a[i-1][k-1]+a[i-1][k];   //a[2][1]=a[1][0]+a[1][1]

else a[i][k]=1;

}

printf("%4d",a[i][k]);    //每个数字占固定4

}

printf("\n"); 

}

return 0;

}

杨辉三角形的六种解法   

 杨辉三角形是形如  

1  

1  1  

1  2  1  

1  3  3  1  

1  4  6  4  1  

的三角形,其实质是二项式(a+b)n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。  

下面给出六种不同的解法。  

解法一  

#include  <stdio.h>  

main()  

{ int i,j,n=0,a[17][17]={0};  

  while(n<1 || n>16)  

  { printf("请输入杨辉三角形的行数:");  

    scanf("%d",&n);  

  }  

  for(i=0;i<n;i++)  

    a[i][0]=1;      /*第一列全置为一*/  

  for(i=1;i<n;i++)  

    for(j=1;j<=i;j++)  

      a[i][j]=a[i-1][j-1]+a[i-1][j];/*每个数是上面两数之和*/  

  for(i=0;i<n;i++)   /*输出杨辉三角*/  

  { for(j=0;j<=i;j++)  

      printf("%5d",a[i][j]);  

    printf("\n");  

  }  

}  

点评:解法一是一般最容易想到的解法,各部分功能独立,程序浅显易懂。  

解法二  

#include  <stdio.h>  

main()  

{ int i,j,n=0,a[17][17]={1};  

  while(n<1 || n>16)  

  { printf("请输入杨辉三角形的行数:");  

    scanf("%d",&n);  

  }  

  for(i=1;i<n;i++)  

  { a[i][0]=1;             /*第一列全置为一*/  

    for(j=1;j<=i;j++)  

      a[i][j]=a[i-1][j-1]+a[i-1][j];  /*每个数是上面两数之和*/  

  }  

    for(i=0;i<n;i++)           /*输出杨辉三角*/  

    { for(j=0;j<=i;j++)  

        printf("%5d",a[i][j]);  

      printf("\n");  

    }  

}  

点评:解窢二是在解法一的基础上,把第一列置为1的命令移到下面的双重循环中,减少了一个循环。注意初始化数组的变化。  

解法三  

#include  <stdio.h>  

main()  

{ int i,j,n=0,a[17][17]={0,1};  

  while(n<1 || n>16)  

  { printf("请输入杨辉三角形的行数:");  

    scanf("%d",&n);  

  }  

  for(i=1;i<=n;i++)  

  for(j=1;j<=i;j++)  

    a[i][j]=a[i-1][j-1]+a[i-1][j];  /*每个数是上面两数之和*/  

  for(i=1;i<=n;i++)          /*输出杨辉三角*/  

  { for(j=1;j<=i;j++) printf("%5d",a[i][j]);  

     printf("\n");  

  }  

}  

点评:解法三是在解法一、二的基础上,把第一列置为1的命令去掉了,注意初始化数组的变化。  

解法四  

#include  <stdio.h>  

main()  

{ int i,j,n=0,a[17][17]={0,1};  

  while(n<1 || n>16)  

  { printf("请输入杨辉三角形的行数:");  

    scanf("%d",&n);  

  }  

  for(i=1;i<=n;i++)  

  { for(j=1;j<=i;j++)  

    { a[i][j]=a[i-1][j-1]+a[i-1][j];  /*每个数是上面两数之和*/  

      printf("%5d",a[i][j]);   /*输出杨辉三角*/  

    }  

    printf("\n");  

  }  

}  

点评:解法四是在解法三的基础上,把计算和打印合并在一个双重循环中。  

解法五  

#include <stdio.h>  

main()  

{ int i,j,n=0,a[17]={1},b[17];  

  while(n<1 || n>16)  

  { printf("请输入杨辉三角形的行数:");  

    scanf("%d",&n);  

  }  

  for(i=0;i<n;i++)  

  { b[0]=a[0];  

    for(j=1;j<=i;j++)  

       b[j]=a[j-1]+a[j];  /*每个数是上面两数之和*/  

    for(j=0;j<=i;j++)           /*输出杨辉三角*/  

    { a[j]=b[j];  /*把算得的新行赋给a,用于打印和下一次计算*/  

      printf("%5d",a[j]);  

    }  

    printf("\n");  

  }  

}  

点评:解法一到解法四都用了二维数组,占用的空间较多。而解法五只使用了两个一维数组。  

解法六  

#include  <stdio.h>  

main()  

{ int i,j,n=0,a[17]={0,1},l,r;  

  while(n<1 || n>16)  

  { printf("请输入杨辉三角形的行数:");  

    scanf("%d",&n);  

  }  

  for(i=1;i<=n;i++)  

  { l=0;  

    for(j=1;j<=i;j++)  

    { r=a[j];  

      a[j]=l+r;  /*每个数是上面两数之和*/  

      l=r;  

      printf("%5d",a[j]);  /*输出杨辉三角*/  

    }  

    printf("\n");  

  }  

 

60 数组-03. 冒泡法排序(20)

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

本题要求对任意给定的K<N),输出扫描完第K遍后的中间结果数列。

输入格式:

输入在第1行中给出NK1<=K<N<=100),在第2行中给出N个待排序的整数,数字间以空格分隔。

输出格式:

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

输入样例:

6 2

2 3 5 1 6 4

输出样例:

2 1 3 4 5 6

 

#include<stdio.h>

int main(void)

{

int n,k,i,j,t,p,a[100];

scanf("%d%d",&n,&k);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

 

for(i=0;i<k;i++){

for(j=0;j<n-1;j++)

if(a[j]>a[j+1]){

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

    }

    for(i=0;i<n;i++){

printf("%d",a[i]);

if(i!=n-1) printf(" ");

else printf("\n");

}

}

61  数组-04. 查找整数(10)

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第1行中给出2个正整数N<=20)和X,第2行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

输入样例1

5 7

3 5 7 1 9

输出样例1

2

 

#include<stdio.h>

int main(void)

{

int n,x,i,flag=1;

int a[20];

scanf("%d%d",&n,&x); 

for(i=0;i<n;i++){

scanf("%d",&a[i]);

}

for(i=0;i<n;i++){ 

if(a[i]==x){printf("%d",i);flag=0;}

if(flag) printf("Not Found\n");

return 0;

}

62 数组-05. 字符串字母大小写转换(10)

输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。

输入格式:输入在一行中给出一个长度不超过40的、以#结束的非空字符串。

输出格式:在一行中按照要求输出转换后的字符串。

输入样例:

Hello World! 123#

输出样例:

hELLO wORLD! 123

 

#include <stdio.h>

#include <string.h>

int main()

{

    char str[50];

    int i=0;

    gets(str);

    while(str[i]!='#')

    {

        if(str[i]>='a'&&str[i]<='z')

            str[i]=str[i]-32;    //小写字母转换为大写字母

        else if(str[i]>='A'&&str[i]<='Z')

            str[i]=str[i]+32;   //大写字母转换为小写字母

            i++;

    }

    for(int j=0;j<i;j++)

        printf("%c",str[j]);

    printf("\n");

    return 0;

}

63 数组-06. 找出不是两个数组共有的元素(20)

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

输入格式:

输入分别在2行中给出2个整型数组,每行先给出正整数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

输出样例:

3 5 -15 6 4 1

 

#include<stdio.h>

int main(void)

{

int n,m,a[20],b[20],c[40],i,j,d,k=0,f,e=0,flag1,flag2;

scanf("%d",&n);

for(i=0;i<n;i++){

scanf("%d",&a[i]);

}

scanf("%d",&m);

for(j=0;j<m;j++){

scanf("%d",&b[j]);

}

for(i=0;i<n;i++)

for(j=0;j<m;j++){

if(a[i]==b[j]){

c[k]=a[i];k++;

}

}

if(k==0){

for(i=0;i<n;i++){

if(e==0){printf("%d",a[i]);e++;}

else printf(" %d",a[i]);

}

for(j=0;j<m;j++){

if(e==0){printf("%d",b[j]);e++;}

else printf(" %d",b[j]);

}

for(i=0;i<n;i++){

flag1=1;

for(j=0;j<k;j++){

if(a[i]!=c[j]) f=1;

else{f=0;break;}

}

if(f){

for(d=0;d<i;++d){

if(a[d]==a[i]) {flag1=0;break;}

}

if(flag1){

if(e==0){printf("%d",a[i]);e++;}

else printf(" %d",a[i]);

}

}

}

for(i=0;i<m;i++){

for(j=0;j<k;j++){

flag2=1;

if(b[i]!=c[j]) f=1;

else{f=0;break;}

}

if(f){

for(d=0;d<i;++d){

if(b[d]==b[i]){flag2=0;break;}

}

if(flag2){

if(e==0){printf("%d",b[i]);e++;}

else printf(" %d",b[i]);

}

}

}

return 0;

64 数组-07. 求一批整数中出现最多的个位数字(20)

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

 

输入格式:

 

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

 

输出格式:

 

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

 

输入样例:

3

1234 2345 3456

输出样例:

3: 3 4

#include<stdio.h>

#include<math.h>

int c[10]={0};

int main(void)

{

int n,i,a[1000],max;

void f(int b,int n);

scanf("%d",&n);

for(i=0;i<n;i++){

scanf("%d",&a[i]);

}

for(i=0;i<n;i++){

f(a[i],n);

}

max=c[0];

for(i=0;i<10;i++){

if(max<c[i]) max=c[i];

}

printf("%d:",max);

for(i=0;i<10;i++){

if(c[i]==max) printf(" %d",i);

}

return 0;

void f(int b,int n)

{

int a,d,e,j=0,k;

e=b;

while(e>0){

e=e/10;

j++;

}

for(k=0;k<j;k++){

a=b/pow(10,k);

d=b/pow(10,k+1);

if(a<10) c[a]++;

else c[a-10*d]++;

}

}

65 数组-08. 字符串转换成十进制整数(15)

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果过滤后字符串的首字符为“-”,代表该数是负数。

 

输入格式:

 

输入在一行中给出一个以#结束的非空字符串。

 

输出格式:

 

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

 

输入样例:

+P-xf4+-1!#

输出样例:

-3905

#include<stdio.h>

#include<math.h>

int main()

{

char s[80];

int a[80],sum=0,b;

gets(s);

int i=0,j=0,flag=0;

while(s[i]!='#'){

if(s[i]>='0'&&s[i]<='9'){a[j]=s[i]-48;j++;}

if(s[i]=='A'||s[i]=='a'){a[j]=10;j++;}

if(s[i]=='B'||s[i]=='b'){a[j]=11;j++;}

if(s[i]=='C'||s[i]=='c'){a[j]=12;j++;}

if(s[i]=='D'||s[i]=='d'){a[j]=13;j++;}

if(s[i]=='E'||s[i]=='e'){a[j]=14;j++;}

if(s[i]=='F'||s[i]=='f'){a[j]=15;j++;}

if(j==1) b=i;

i++;

}

for(i=0;i<b;i++){

if(s[i]=='-'){

flag=1;

break;

}

}

if(flag) printf("-");

for(i=j-1;i>=0;i--){

sum+=a[i]*pow(16,j-1-i);

}

printf("%d",sum);

66 数组-09. 求矩阵的局部极大值(15)

给定MN列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

 

输入格式:

 

输入在第1行中给出矩阵A的行数M和列数N3<=M,N<=20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

 

输出格式:

 

每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

 

输入样例1

4 5

1 1 1 1 1

1 3 9 3 1

1 5 3 5 1

1 1 1 1 1

输出样例1

9 2 3

5 3 2

5 3 4

#include<stdio.h>

int main(void)

{

int a[21][21],m,n,i,j,flag=1;

scanf("%d%d",&m,&n);

for(i=1;i<=m;i++)

for(j=1;j<=n;j++){

scanf("%d",&a[i][j]);

}

for(i=2;i<m;i++)

for(j=2;j<n;j++){

if(a[i][j]>a[i-1][j]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j]){

printf("%d %d %d\n",a[i][j],i,j);flag=0;

}

}

if(flag) printf("None %d %d",m,n);

return 0;

}

67 数组-10. 求整数序列中出现次数最多的数(15)

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

 

输入格式:

 

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

 

输出格式:

 

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

 

输入样例:

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

输出样例:

3 4

#include<stdio.h>

int main(void)

{

int a[1000],b[1000]={0},n,i,j,max,f=1,flag=1;

scanf("%d",&n);

for(i=0;i<n;i++){

scanf("%d",&a[i]);

}

for(i=0;i<n;i++){

for(j=0;j<i;j++){

if(a[j]==a[i]){b[j]++;break;f=0;}

}

if(f) b[i]++;

}

max=b[0];

for(i=0;i<n;i++){

if(max<b[i]){max=b[i];j=i;flag=0;}

}

if(flag) j=0;

printf("%d %d\n",a[j],max);

return 0;

68  数组-11. 猴子选大王(20)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

 

输入格式:

 

输入在一行中给一个正整数N<=1000)。

 

输出格式:

 

在一行中输出当选猴王的编号。

 

输入样例:

11

输出样例:

7

#include<stdio.h>

int main(void)

{

int n,i,s=0,a[1000]={0},j=0;

scanf("%d",&n);

while(s<n-1){

s=0;

for(i=0;i<n;i++){

if(a[i]==0) j++;

if(j==3){a[i]=1;j=0;}

}

for(i=0;i<n;i++) s+=a[i]; 

}

for(i=0;i<n;i++){

if(a[i]==0) printf("%d\n",i+1);

}

return 0;

}

69 数组-12. 简易连连看(20)

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

 

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

 

输入格式:

 

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

 

输出格式:

 

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

 

输入样例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,sum,N,i,j,g,k,flag=1,h,count1=0,count2=0;

scanf("%d",&N);

getchar();

for(i=1;i<=2*N;i++)

for(j=1;j<=2*N;j++){

ch[i][j]=getchar();

getchar();

}

scanf("%d",&sum);

for(i=0;i<sum;i++){

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(j=1;j<=2*N;j++)

for(h=1;h<=2*N;h++){

printf("%c",ch[j][h]);

 if(h==2*N) printf("\n");

 else printf(" ");

}

else{

printf("Uh-oh\n");count1++;

}

if(count1>=3){printf("Game Over\n");break;}

for(j=1;j<=2*N;j++)

for(h=1;h<=2*N;h++){

if(ch[j][h]!='*') count2++;

}

if(count2==2){printf("Congratulations!\n");break;}

flag=1;count2=0;

}

return 0;

}

70 数组-14. 数字加密(15)

输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601

 

输入格式:

 

输入在一行中给出一个四位的整数x,即要求被加密的数。

 

输出格式:

 

在一行中按照格式“The encrypted number is V”输出加密后得到的新数V

 

输入样例:

1257

输出样例:

The encrypted number is 4601

#include<stdio.h>

int main(void)

{

int a[4],i,n,t;

scanf("%d",&n);

a[0]=n/1000;

a[1]=(n/100)%10;

a[2]=(n/10)-a[0]*100-a[1]*10;

a[3]=n-a[0]*1000-a[1]*100-a[2]*10;

for(i=0;i<4;i++){

a[i]+=9;

a[i]=a[i]%10;

}

t=a[0];

a[0]=a[2];

a[2]=t;

t=a[1];

a[1]=a[3];

a[3]=t;

printf("The encrypted number is ");

for(i=0;i<4;i++){

printf("%d",a[i]);

}

return 0;

2)#include <stdio.h>

int main(void) {

    int n, a, b, c, d;

    char ch[4];

    scanf("%d", &n);    

    a = n % 10;             /* 个位*/

    b = (n / 10) % 10; /* 十位 */

    c = (n / 100) % 10; /* 百位 */

    d = (n / 1000) % 10; /* 千位 */

    a = (a + 9) % 10;           /* 910取余 */

    b = (b + 9) % 10;

    c = (c + 9) % 10;

    d = (d + 9) % 10;

    ch[0] = b + '0';        /* 用字符,保证转换后输出千位不为0 */

    ch[1] = a + '0';

    ch[2] = d + '0';

    ch[3] = c + '0';

    printf("The encrypted number is %c%c%c%c\n", ch[0], ch[1], ch[2], ch[3]);

    return 0;

}

 

71 结构-01. 有理数比较(10)

本题要求编写程序,比较两个有理数的大小。

 

输入格式:

 

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

 

输出格式:

 

在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。

 

输入样例1

1/2 3/4

输出样例1

1/2 < 3/4

输入样例2

6/8 3/4

输出样例2

6/8 = 3/4

#include<stdio.h>

int  main(void)

{

struct num{

int a;

char c;

int b;

};

struct num n[2];

int i;

char ch;

for(i=0;i<2;i++){

scanf("%d",&n[i].a);

n[i].c=getchar();

scanf("%d",&n[i].b);

}

if(1.0*n[0].a/n[0].b==1.0*n[1].a/n[1].b) ch='=';

else if(1.0*n[0].a/n[0].b>1.0*n[1].a/n[1].b) ch='>';

else ch='<';

printf("%d/%d %c %d/%d",n[0].a,n[0].b,ch,n[1].a,n[1].b);

return 0;

72 结构-02. 有理数加法(15)

本题要求编写程序,计算两个有理数的和。

 

输入格式:

 

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

 

输出格式:

 

在一行中按照“a/b”的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

 

输入样例1

1/3 1/6

输出样例1

1/2

#include<stdio.h>

int main(void)

{

struct num{

int a;

int b;

};

struct num n[2],sum;

int i,f;

for(i=0;i<2;i++){

scanf("%d",&n[i].a);

getchar();

scanf("%d",&n[i].b);

}

if(n[1].b%n[0].b==0||n[0].b%n[1].b==0){

if(n[1].b%n[0].b==0){

sum.b=n[1].b;

sum.a=n[1].a+n[0].a*(n[1].b/n[0].b);

}

else{

sum.b=n[0].b;

sum.a=n[0].a+n[1].a*(n[0].b/n[1].b);

}

}

else{

sum.b=n[0].b*n[1].b;

sum.a=n[0].a*n[1].b+n[1].a*n[0].b;

}

f=(sum.a>sum.b)?sum.b:sum.a;

while(sum.a%2==0&&sum.b%2==0){

sum.a/=2;

sum.b/=2;

}

for(i=f;i>1;i/=2){

if(sum.a%i==0&&sum.b%i==0){

sum.a/=i;

sum.b/=i;break;

}

}

if(sum.b==1) printf("%d\n",sum.a);

else printf("%d/%d\n",sum.a,sum.b);

return 0;

}

73 结构-03. 平面向量加法(10)

本题要求编写程序,计算两个二维平面向量的和向量。

 

输入格式:

 

输入在一行中按照“x1 y1 x2 y2”的格式给出两个二维平面向量V1=(x1, y1)V2=(x2, y2)的分量。

 

输出格式:

 

在一行中按照“(x, y)”的格式输出和向量,坐标输出小数点后1位(注意不能输出-0.0)。

 

输入样例:

3.5 -2.7 -13.9 8.7

输出样例:

(-10.4, 6.0)

#include<stdio.h>

int main()

{

struct xy{

double x;

double y;

};

struct xy a,b,c;

int i,j;

scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);

c.x=a.x+b.x;

c.y=a.y+b.y;

if(c.x<0&&c.x>-0.05) c.x=0.0;

if(c.y<0&&c.y>-0.05) c.y=0.0; 

printf("(%.1lf, %.1lf)\n",c.x,c.y);

return 0;

}

74 结构-06. 复数四则运算(15)

本题要求编写程序,计算2个复数的和、差、积、商。

 

输入格式:

 

输入在一行中按照“a1 b1 a2 b2”的格式给出2个复数C1=a1+b1*iC2=a2+b2*i的实部和虚部。题目保证C2不为0

 

输出格式:

 

分别在4行中按照“(a1+b1i) 运算符 (a2+b2i) = 结果”的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0

 

输入样例1

2 3.08 -2.04 5.06

输出样例1

(2.0+3.1i) + (-2.0+5.1i) = 8.1i

(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i

(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i

(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i

#include<stdio.h>

#include<math.h>

int main()

{

struct com{

double a;

double b;

};

struct com c1,c2,sum[4];

int i;

char ch;

scanf("%lf%lf%lf%lf",&c1.a,&c1.b,&c2.a,&c2.b);

sum[0].a=c1.a+c2.a;

sum[0].b=c1.b+c2.b;

sum[1].a=c1.a-c2.a;

sum[1].b=c1.b-c2.b;

sum[2].a=c1.a*c2.a-c1.b*c2.b;

sum[2].b=c1.a*c2.b+c1.b*c2.a;

sum[3].a=(c1.a*c2.a+c1.b*c2.b)/(pow(c2.a,2)+pow(c2.b,2));

sum[3].b=(c1.b*c2.a-c1.a*c2.b)/(pow(c2.a,2)+pow(c2.b,2));

for(i=0;i<4;i++){

if(i==0) ch='+';

if(i==1) ch='-';

if(i==2) ch='*';

if(i==3) ch='/';

if(sum[i].a<0.1&&sum[i].a>-0.1&&(sum[i].b>=0.1||sum[i].b<=-0.1))  printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lfi\n",c1.a,c1.b,ch,c2.a,c2.b,sum[i].b);

else if((sum[i].a>=0.1||sum[i].a<=-0.1)&&sum[i].b>-0.1&&sum[i].b<0.1)  printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf\n",c1.a,c1.b,ch,c2.a,c2.b,sum[i].a);

else if(sum[i].a<0.1&&sum[i].a>-0.1&&sum[i].b<0.1&&sum[i].b>-0.1)  printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = 0.0\n",c1.a,c1.b,ch,c2.a,c2.b);

else  printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf%+.1lfi\n",c1.a,c1.b,ch,c2.a,c2.b,sum[i].a,sum[i].b);

}

return 0;

}

75  结构-04. 通讯录的录入与显示(10)

通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

 

输入格式:

 

输入在第1行给出正整数N<=10);随后N行,每行按照格式“姓名 生日 性别 固话 手机”给出一条记录。其中“姓名”是不超过10个字符、不包含空格的非空字符串;生日按“yyyy/mm/dd”的格式给出年月日;性别用“M”表示“男”、“F”表示“女”;“固话”和“手机”均为不超过15位的连续数字,前面有可能出现“+”。

 

在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0N-1顺序编号)。数字间以空格分隔。

 

输出格式:

 

对每一条要查询的记录编号,在一行中按照“姓名 固话 手机 性别 生日”的格式输出该记录。若要查询的记录不存在,则输出“Not Found”。

 

输入样例:

 

3

 

Chris 1984/03/10 F+86181779452 13707010007

 

LaoLao 1967/11/30F 057187951100 +8618618623333

 

QiaoLin 1980/01/01M 84172333 10086

 

2 1 7

 

输出样例:

 

LaoLao 057187951100 +8618618623333 F 1967/11/30

 

Not Found

#include <stdio.h>

#define N 10

struct Person {

char name[11]; /* 名字 */ 

char birthday[11]; /* 生日 */ 

char sex;           /* 性别 */ 

char fixed[17]; /* 固话 */ 

char mobile[17]; /* 手机 */ 

};

int main(void) {

struct Person p[N];

int num[N];

int i, n, k;

scanf("%d", &n);

for(i = 0; i < n; ++i)

scanf("%s %s %c %s %s", p[i].name, p[i].birthday, 

      &p[i].sex, p[i].fixed, p[i].mobile);

scanf("%d", &k);

for(i = 0; i < k; ++i)

scanf("%d", &num[i]);

for(i = 0; i < k; ++i) {

if(num[i] >= 0 && num[i] < n)

printf("%s %s %s %c %s\n", p[num[i]].name, 

       p[num[i]].fixed, p[num[i]].mobile, p[num[i]].sex, p[num[i]].birthday);

else

printf("Not Found\n");

}

return 0;

}

76 结构-05. 有理数均值(20)

本题要求编写程序,计算N个有理数的平均值。

 

输入格式:

 

输入第1行给出正整数N<=100);第2行中按照“a1/b1 a2/b2 ……”的格式给出N个分数形式的有理数,其中分子和分母全是整型范围内的整数;如果是负数,则负号一定出现在最前面。

 

输出格式:

 

在一行中按照“a/b”的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

 

输入样例1

 

4

 

1/2 1/6 3/6 -5/10

 

输出样例1

 

1/6

#include <stdio.h>

#define N 100

struct Rational {

int n; /* 分子 */ 

int d; /* 分母 */ 

};

int gcd(int m, int n) { /* 求最大公约数 */ 

int r;

if(m == 0 && n == 0)

return 0;

if(m == 0)

return n;

if(n == 0)

return m;

while(1) {

r = m % n;

if(r == 0)

break;

m = n;

n = r;

}

return n;

}

int main(void) {

struct Rational ra[N], r;

int i, n, g;

scanf("%d", &n);

for(i = 0; i < n; ++i)

scanf("%d/%d", &ra[i].n, &ra[i].d);

r.n = 0;

r.d = 1;

for(i = 0; i < n; ++i) {

r.n = r.n * ra[i].d + r.d * ra[i].n;

r.d = r.d * ra[i].d;

}

r.d *= n; /*平均值 */ 

g = gcd(r.n, r.d);

if(g != 0) {

r.n /= g;

r.d /= g;

}

if(r.n == 0)

printf("%d\n", r.n);

else if(r.d == 1)

printf("%d\n", r.n);

else

printf("%d/%d\n", r.n, r.d);

return 0; 

}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MOOC PAT练习是指在在线课程平台上进行的编程能力考试。它提供了一系列编程题目,旨在帮助学生提高解决问题的能力和编程技能。下面是对此练习的回答: MOOC PAT练习是一种非常有益的学习资源。它可以帮助学生在虚拟的环境中解决实际问题,并通过编程来提高解决问题的能力。通过这种方式,学生可以更好地理解和掌握编程语言和算法知识。 MOOC PAT练习不仅可以提升学生的编程能力,还可以培养学生的创新思维和团队合作精神。在解决编程题目时,学生需要思考合适的算法和数据结构,同时还需要灵活运用编程语言来实现自己的想法。这样的练习可以锻炼学生的析问题和解决问题的能力,培养其创新和合作意识。 通过MOOC PAT练习,学生可以接触到各种各样的编程题目,涵盖了不同的难度级别和主题领域。这对于学生来说是一个很好的学习机会,可以不断地挑战自己、提高自己。此外,该练习还提供了评测功能,学生可以实时了解自己的答题情况,并获得相应的反馈和建议,这有助于他们更好地调整学习进度和方向。 总结来说,MOOC PAT练习是一个非常有价值的学习资源,它可以提升学生的编程能力、培养创新和合作意识,并且通过不断挑战和实践来提高自己。对于想要学习编程的人来说,参加MOOC PAT练习是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值