2022年4月26日华为OD机试记录

考试时间150分钟,三道题分别是100,100,200分,考了370分,是自己自学了一个月的结果,其实最麻烦的感觉还是第二道题,因为第三题我知道自己错在哪里却没有时间去改了,就没有改了。

第一题:分解质因数:给定一个正整数,将其分解成两个质数的乘积,输出两个质数,按从小到大排序,有多组只需输出一组;如果没有则输出NO。

例如:输入15,输出3 5;输入7,输出NO。

#include<stdio.h>
#include<math.h>
//判断一个数是否为质数,是则返回1,否则返回0;
int prime(int x) {
    for (int i = 2; i <= sqrt(x); i++) {
        if (x % i == 0)
            return 0;
    }
    return 1;
}

int main()
{
    int number = 0;
    scanf("%d", &number);
    //一个数分解成两数之积,一定有一数小于等于该数的平方根;
    for (int i = 2; i <= sqrt(number);)
    {
        if (number % i == 0)
        {
            //找到一个因数就判断是否为质数;
            if (prime(i) == 1 && prime(number / i) == 1) {
                printf("%d %d\n", i, number / i);
                return 0;
            }
        }
        //i的变化方式
        if (i == 2)
            i++;
        else
            i += 2;
    }
    printf("NO\n");
    return 0;
}

第二题:输入一个三行五列的不等式组,条件有:

系数(double类型):a11,a12,a13,a14,a15;a21,a22,a23,a24,a25;a31,a32,a33,a34,a35;

变量(int类型):x1,x1,x3,x4,x5;

式值(double类型):y1,y2,y3;

符号(只有五种):<=,>=,<,>,=;

输入格式:a11,a12,a13,a14,a15;a21,a22,a23,a24,a25;a31,a32,a33,a34,a35;x1,x1,x3,x4,x5;y1,y2,y3;<=,>=,<

最大差值为:max{a11*x1+a12*x2+a13*x3+a14*x4+a15*x5-y1;a21*x1+a22*x2+a23*x3+a24*x4+a25*x5-y2;a31*x1+a32*x2+a33*x3+a34*x4+a35*x5-y3};

输出格式:都成立:true 最大差值

不成立:false 最大差值

#include<stdio.h>
#include<math.h>
void test(int m,int j) {
	char ch = ',', dh = ';';
	if (j < m)
		scanf("%c", &ch);
	else
		scanf("%c", &dh);
}
int signjudge(char* p) {
	if (*(p + 1) == '\0')
	{
		if (*p == '>')
			return 1;
		else if (*p == '=')
			return 0;
		else
			return - 1;
	}
	else
	{
		if (*p == '>')
			return 2;
		else
			return -2;
	}
}

int main()
{
	double a[3][5];//系数
	int x[5];//变量
	double y[3];//式值
	char strsign[20];//符号字符串
	char ch = ',', dh = ';';
	//输入系数
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 5; j++) {
			scanf("%lf", &a[i][j]);
			test(4,j);
		}
	}
	//输入变量和式值
	for (int i = 0; i < 5; i++) {
		scanf("%d", &x[i]);
		test(4,i);
	}
	for (int i = 0; i < 3; i++) {
		scanf("%lf", &y[i]);
		test(2,i);
	}
	//输入符号字符串并分割判断
	scanf("%s", strsign);
	int sign[3],k=2;
	strsign[strlen(strsign)] = '\0';
	for (int i = strlen(strsign)-1; i >=0 ; i--)
	{
		if (strsign[i] == ',')
		{
			char* p = &strsign[i + 1];
			sign[k--] = signjudge(p);
			strsign[i] = '\0';
		}
	}
	char* p = &strsign[0];
	sign[k] = signjudge(p);
	//求不等式左边的值
	double sum[3]={0.0};
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			sum[i] += a[i][j] * x[j];
		}
	}
	//判断不等式是否成立
	int flag = 0;
	for (int i = 0; i < 3; i++)
	{
		if (sum[i] - y[i] > 0 && sign[i] > 0)
			flag = 1;
		else if (sum[i] - y[i] < 0 && sign[i] < 0)
			flag = 1;
		else if (sum[i] == y[i] && sign[i] > -2 && sign[i] < 2)
			flag = 1;
		else
		{
			flag = 0;
			break;
		}
	}
	if (flag == 0)
		printf("false ");
	else
		printf("true ");
	//求最大差值
	int differ[3],s=0;
	for (int i = 0; i < 3; i++)
	{
		differ[s++] = sum[i] - y[i];
	}
	int maxdiffer = (s = (differ[0] > differ[1] ? differ[0] : differ[1]), s > differ[2] ? s : differ[2]);
	printf("%d\n", maxdiffer);
	return 0;
}

第三题:扑克牌顺子

给定13张牌(牌型有2,3,4,5,6,7,8,9,10,J,Q,K,A);顺子最少需要五张连续的牌,最小牌从3开始,最大到A;如{2,3,4,5,6},{J,Q,K,A,2}都不是顺子,输入13张牌的牌型(会有重复),输出其中可以组成的顺子,如有多组,按顺子的第一张牌大小排序输出,没有则输出NO;

例如:输入 2 3 5 J K Q 9 8 7 7 J A 2

输出 NO;

输入:J K 2 4 7 8 9 8 10 Q 3 K J

输出 7 8 9 10 J Q K

#include<stdio.h>
#include<string.h>
int cmp(int* a, int* b) {
	return *a - *b;
}
int main()
{
	//输入牌型有字符有数字还有‘10’,所以我选择按字符串输入,再分割
	char str[30];
	gets(str);
	int len = strlen(str);
	str[len] = '\0';
	char str1[][3] = { "2","3","4","5","6","7","8","9","10","J","Q","K","A" };
	int arr[] = { 2,3,4,5,6,7,8,9,10,11,12,13,14 };
	int sign[14];//分割后的数组
	int index = 0;//下标
	for (int i = 0; i <= len; i++)
	{
		if (str[i] == ' ' || str[i] == '\0')
		{
			if (str[i - 1] == '0')
				sign[index++] = 10;
			else
			{
				for (int j = 0; j < 13; j++)
				{
					if (str[i - 1] == str1[j][0])
					{
						sign[index++] = arr[j];
						break;
					}
				}
			}
		}
	}
	int flag = 0;
	model:qsort(sign, 13, sizeof(int), cmp);
	for (int i = 0; i < 13; i++)
	{
		if (sign[i] >= 3 && sign[i] <= 10)
		{
			int k = sign[i];
			int count = 1;
			for (int j = i + 1; j < 13; j++)
			{
				if (sign[j] - sign[j - 1] == 1)
				{
					count++;
					sign[j - 1] = 2;
					if (sign[j] == 14)
					{
						sign[j] = 2;
						break;
					}
				}
				else if (sign[j] == sign[j - 1])
					continue;
				else
					break;
			}
			if (count >= 5)
			{
				flag = 1;
				for (int j = k; j < k + count; j++) {
					printf("%s ", str1[j - 2]);
				}
				printf("\n");
				goto model;
			}
		}
	}
	if (flag == 0)
		printf("NO\n");
	return 0;
}

第三题当时的通过率是85%,肯定是忽略了3344556677这样两条重复的顺子,这次应该没有问题了。

  • 10
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值