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,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(0<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行杨辉三角。
输入格式:
输入在一行中给出N(1<=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行中给出N和K(1<=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个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入格式:
输入在第1行中给出正整数N(<=1000),在第2行中给出N个不超过整型范围的正整数,数字间以空格分隔。
输出格式:
在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
输入样例:
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)
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式:
输入在第1行中给出矩阵A的行数M和列数N(3<=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)
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
输入格式:
输入在一行中给出序列中整数个数N(0<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”给出一个玩家的输入。注意格子的行、列编号是从1到2N。
输出格式:
根据玩家的每一步输入,输出相应的结果。输出盘面时注意,每行字符间以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; /* 加9除10取余 */
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*i和C2=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个整数,表示要查询的记录编号(从0到N-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;
}