2022年4月26日华为OD机试记录
时间:2022-08-03 17:19:00 sitemap
考试时间为150分钟,三道题分别为100分、100分、200分和370分。这是我自学一个月的结果。事实上,最麻烦的感觉是第二道题,因为我知道我错在哪里,但我没有时间改变第三道题,所以我没有改变。
第一个问题:分解质因数:给定一个正整数,分解成两个质数的乘积,输出两个质数,从小到大排序。多组只需输出一组;如果没有,输出NO。
例如:输入15,输出3 5.输入7,输出NO。
#include #include //判断一个数是否为质数,是的,返回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 #include 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 #include 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这样两条重复的顺子,这次应该没有问题了。