考试时间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这样两条重复的顺子,这次应该没有问题了。