资讯详情

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] ? differ[0] : differ[1]), s > differ[2] ? s : differ[2]);  printf("%d\n", maxdiffer);  return 0; }

第三题:扑克顺子

给定13张牌(2、3、4、5、6、7、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、4、5、6、7、9、11、12、1314 };  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] == sin[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这样两条重复的顺子,这次应该没有问题了。

标签: x5y2传感器实物拍摄感应开关a21传感器微型对射传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台