18级学习小组第一次测试
A. 判断闰年
B. 含k个7的值
C. 大整数加法
D. 矩阵相似度
E. 排列
A 判断闰年
难度系数:★☆☆☆☆
描述 判断某年是否为闰年
输入: 输入只有一行,包含一个整数 a(0 < a < 3000)。
输出: 一行,如果公元 a 年是闰年输出 Y,否则输出 N。
提示 公历纪年法中,能被 4 整除的大多是闰年,但能被 100 整除而不能被 400 整除的年份不是 闰年, 能被 3200 整除的也不是闰年,如 1900 年是平年,2000 年是闰年,3200 年不 是闰年。
源码如下:
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
if (a%4==0&&a%100!=0||a%400==0)
printf("Y");
else
printf("N");
return 0;
}
总结:
本题主要考察if语句的使用;
此外还考察了闰年的判断方法。
B 含k个7的值
难度系数:★★☆☆☆
描述 输入两个正整数 m 和 k,其中 1 < m < 100000,1 < k < 5 ,判断 m 能否被 3 整除,且恰好含有 k 个 7,如果满足条件,则输出 YES,否则,输出 NO。 例如,输入:768 1 满足条件,输出 YES。 如果输入:7937 2 尽管有 2 个 7,但不能被 3 整除,也不满足条件,应输出 NO。
输入: m 和 k 的值,中间用单个空格间隔。
输出: 满足条件时输出 YES,不满足时输出 NO。
源码如下:
#include <stdio.h>
int main()
{
int m,k,i,s=0;
scanf("%d%d",&m,&k);
i=m;
while(i!=0)
{
if(i%10==7)
s++;
i=i/10;
}
if(m%3==0&&s==k)
printf("YES");
else
printf("NO");
return 0;
}
由于源码无法判断m和k的范围,所以我们可以对源码进行完善。
完善后代码如下:
#include <stdio.h>
int main()
{
int m,k,i,s=0;
scanf("%d%d",&m,&k);
i=m;
if(1<i && i<100000 && 1<k && k<5) //实现对m和k范围的控制
{
while(i!=0)
{
if(i%10==7)
s++;
i=i/10;
}
if(m%3==0&&s==k)
printf("YES");
else
printf("NO");
}
else printf("Input Error!Please Retry!\n");
return 0;
}
总结:
本题考查if语句和while语句的使用;
在完善源码时还考察了**&&和||的使用**以及 if else的匹配。
C 大整数加法
难度系数:★★★★☆
描述 求两个不超过 200 位的非负整数的和。
输入:有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。
输出:一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能 输出为 0342。
源码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char a[205],b[205]; //定义函数
int s[210],c[210],i,j,l1,l2;
scanf("%s%s",a,b); //输入数据并判断长度
l1=strlen(a);
l2=strlen(b);
for(i=0;i<210;i++)
{
s[i]=0;
c[i]=0;
}
for(i=l1-1,j=0;i>=0;i--) //将数据转化为整形
{
s[j]=a[i]-'0';
j+=1;
}
for(i=l2-1,j=0;i>=0;i--)
{
c[j]=b[i]-'0';
j+=1;
}
for (i=0;i<209;i++) //将大整数相加
{
s[i]=s[i]+c[i];
if (s[i]>=10)
{
s[i+1]+=1;
s[i]-=10;
}
}
i=209; //输出结果
while(s[i]==0)
{
i--;
if(i==0)
break;
}
for (j=i;j>=0;j--)
printf("%d",s[j]);
return 0;
}
总结:
这里我们用到了字符串函数strlen():此函数的功能是计算字符串的长度。调用它时需要声明#include<string.h>;
由字符型转换为整型,实质是用ASCII码来进行转换;
此题运用的有一维数组(int型和char型)、for循环、while循环。
D. 矩阵相似度
难度系数:★★★★☆
描述 :
给出两幅相同大小的黑白图像(用 0-1 矩阵)表示,求它们的相似度。
说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像 素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
输入 :第一行包含一个整数 n,表示图像的行列数。1 <= n <= 100。 之后 n 行,每行 n 个整数 0 或 1,表示第一幅黑白图像上各像素点的颜色。相邻两个 数之间用单个空格隔开。 之后 n 行,每行 n 个整数 0 或 1,表示第二幅黑白图像上各像素点的颜色。相邻两个 数之间用单个空格隔开。
输出: 一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。
源码如下:
#include <stdio.h>
int main()
{
int a[110][110],m,n,i,j,s=0;
scanf("%d",&n); //n控制行数
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);//首先初始化一个矩阵
for (i=0;i<n;i++)
for (j=0;j<n;j++){
scanf("%d", &m);
if (a[i][j]==m)
s++; //s表示两矩阵中颜色相同的像素个数
}
printf("%.2f\n",(float)s/(n*n)*100);
return 0;
}
总结:
此题中运用的有二维数组、for循环的嵌套和输出小数点的位数。其中较难理解的是for循环的嵌套
E. 排列
难度系数:★★★★☆
描述:用 1~9 这 9 个数字组成 3 个三位数 abc,def 和 ghi,要求每个数字恰好使用一次, 且 abc:def:ghi=1:2:3。
输入:无。
输出: 输出所有可能的解,每行输出一组,整数之间以空格隔开。
源码如下:
#include <stdio.h>
int main()
{int a,b,c,d,e,f,g,h,i;
for(a=1;a<10;a++)
for(b=1;b<10;b++)
for(c=1;c<10;c++)
for(d=1;d<10;d++)
for(e=1;e<10;e++)
for(f=1;f<10;f++)
for(g=1;g<10;g++)
for(h=1;h<10;h++)
for(i=1;i<10;i++)
{
if(a==b||a==c||a==d||a==e||a==f||a==g||a==h||a==i
||b==c||b==d||b==e||b==f||b==g||b==h||b==i
||c==d||c==e||c==f||c==g||c==h||c==i||d==e
||d==f||d==g||d==h||d==i||e==f||e==g||e==h
||e==i||f==g||f==h||f==i||g==h||g==i||h==i)
continue;
else{
if((a*100+b*10+c)*2==d*100+e*10+f&&(a*100+b*10+c)*3==g*100+h*10+i)
printf("%d %d %d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
else
continue;
}
}
return 0;
}
总结:
不足:以上方案比较直接,运用了过多的for循环嵌套,会导致计算机运算速度缓慢。
此题用到了for循环的嵌套;
这里说明break和continue的区别:
break的功能为跳出整个循环;
continue的功能为结束本次循环,跳入下一次循环。
To be continue.
By Yxxx