18级学习小组第一次测试

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循环的嵌套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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值