杭电2011年笔试

1.判断构成三角形

输入3个正整数 A, B, C, 判断这三个数能不能构成一个三角形

思路:

两边之和 > 第三边;两边之差 < 第三边。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

bool Judge(int a, int b, int c) {
	if ((a + b > c && a + c > b && b + c > a) && (a - b < c && a - c < b && b - c < a))
		return true;
	else
		return false;
}

int main() {
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	if (Judge(a, b, c))
		printf("OK\n");
	else
		printf("NO\n");
	return 0;
}

2. 打鱼还是晒网

有个人从2003年1月1日开始,三天打鱼两天晒网,请输入月份、日期,问在当年的某一天他是在打鱼还是晒网。

思路:

算距离2003.1.1的天数,根据对5取模的不同,判断在打鱼还是晒网。

#define _CRT_SECURE_NO_WARNINGS 1
#include <cstdio>
int cal[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

int main() {
	int month, day;
	scanf("%d%d", &month, &day);
	int days = 0;
	for (int i = 0; i < month; i++) {
		days += cal[i];
	}
	days += day;
	//printf("%d\n", days);
	int status = days % 5;
	if (status >= 1 && status <= 3)
		printf("打鱼\n");
	else
		printf("晒网");
	
	return 0;
}

3. 丑数

leetcode.263

质因子分解

参考:《算法笔记》5.6 质因子分解

一个数的所有质因子:

情况一:

所有质因子都小于等于 sqrt(n)

情况二:

有一个质因子大于 sqrt(n),其余的质因子小于等于 sqrt(n)

模板代码:

// 先打素数表
struct factor{
	int x;
	int cnt;
}fac[10];
int num = 0;
if(n % prime[i] == 0){
	fac[num].x = prime[i];
	fac[num].cnt = 0;
	while(n % prime[i] == 0){
		fac[num].cnt++;
		n /= prime[i];
	}
	num++;
}
if(n != 1){
	fac[num].x = n;
	fac[num].cnt = 1;
}

题解思路:

先打只包含2 3 5 7 的素数表,如果这个数的质因子中最后一个质因子不是这些数,说明有其他的质因子。所以就不是丑数。

题解代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int prime[4] = { 2, 3, 5, 7 };
struct factor {
	int x; // 因子的值
	int cnt; // 因子的个数
}fac[10]; 

int main() {
	int n;
	scanf("%d", &n);
	int sqr = (int)sqrt(1.0*n);
	int num = 0;
	for (int i = 0; i < 4 && prime[i] <= sqr; i++) {
		if (n % prime[i] == 0) {
			fac[num].x = prime[i];
			fac[num].cnt = 0;
			while (n % prime[i] == 0) {
				fac[num].cnt++;
				n /= prime[i];
			}
			num++;
		}
		if (n != 1) {
			fac[num].x = n;
			fac[num++].cnt = 1;
		}
	}
	int last = fac[num - 1].x;
	if (last == 2 || last == 3 || last == 5 || last == 7)
		printf("YES");
	else
		printf("NO");
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值