小赌怡情 (15 分)
水题
#include<stdio.h>
int main() {
int total, n, num1, num2, b, t;
scanf("%d %d",&total, &n);
for(int i=0; i<n; i++) {
scanf("%d %d %d %d",&num1, &b, &t, &num2);
if(t > total) {
printf("Not enough tokens. Total = %d.", total);
} else {
if(num1>num2 == !b) {
total += t;
printf("Win %d! Total = %d.", t, total);
} else {
total -= t;
printf("Lose %d. Total = %d.", t, total);
}
if(total <= 0) {
printf("\nGame Over.");
break;
}
}
if(i !=n-1)
printf("\n");
}
}
开学寄语 (20 分)
思路 三层循环暴力破解
#include<stdio.h>
/*
U: 6666 6666
GG: 2333
JJ: 6666 2333
3 5
*/
int main() {
int m, n, x, arr[6] = {0};
int cnt = 0;//学生数
int _cnt =0;//违禁物品数
scanf("%d %d", &m, &n);
for(int i=0; i<n; i++)
scanf("%d",&arr[i]);
for(int i=0; i<m; i++) {
int k = 0;
int flag = 0;
char name[5];
scanf("%s %d", &name, &k);
for(int j=0; j<k; j++) {
scanf("%d", &x);
for(int l=0; l<n; l++) {
if(x==arr[l]) {
_cnt++;
if(!flag) {//对于每个学生而言,第一次查到违禁物品要先输出名字,再输出违禁物品编号
printf("%s:",name);
cnt++;
flag = 1;
}
printf(" %.4d",x);
}
}
}
if(flag)//如果学生有违禁物品,flag会置为1.如此可以判断是否需要输出换行
printf("\n");
}
printf("%d %d",cnt, _cnt);
}
多选题常见计分法 (20 分)
这个题给的输出样例是错的吧,第三题的b是正确选项,测试样例显示第三题b选项错了两次
#include<stdio.h>
#include<string.h>
typedef struct _project {
float grade;
int total;
char ans[15];
int wrong[5];//abcde这五个选项各错了几次
int cnt;//本题错误次数
} Project;
int Check(char s1[], char s2[], Project* p, int* max);
int main() {
int n, m, max = 0;//max:m个题中,错误最多的次数
char ch[15] = "";
Project project[1000];
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++) {
project[i].cnt = 0;
for(int j=0; j<5; j++)
project[i].wrong[j] = 0;
scanf("%f %d ", &project[i].grade, &project[i].total);
fgets(project[i].ans, 15, stdin);//若从stdin拿到的字符串长度小于14,会把\n也放到字符串中
if(project[i].ans[strlen(project[i].ans)-1]== '\n')
project[i].ans[strlen(project[i].ans)-1] = '\0';
}
for(int i=0; i<n; i++) {
char c;
float grade = 0;
for(int j=0; j<m;) {
if((c=getchar()) == '(') {
scanf("%[^)]",&ch);
if(strcmp(ch,project[j].ans) == 0)//答案完全正确
grade += project[j].grade;
else {
project[j].cnt++;
if(Check(project[j].ans, ch, &project[j], &max) == 0)
grade += project[j].grade/2;
}
j++;
}
}
printf("%.1f\n",grade);
}
if(max == 0) {
printf("Too simple");
} else {
n = 0;
for(int i=0; i<m; i++) {
if(project[i].cnt >= max) {
for(int j=0; j<5; j++) {
if(project[i].wrong[j] == max) {
if(n)
printf("\n");
printf("%d %d-%c", max, i+1, 'a'+j);
n=1;
}
}
}
}
}
}
int Check(char s1[], char s2[], Project* p, int* max) {
int flag, res = 0;//是否有错选,有则返回1没有返回0;
for(int i=2; s2[i]!='\0'; i++) {
if(s2[i] == ' ')
continue;
flag = 0;
for(int j=2; s1[j]!='\0'; j++) {
if(s2[i] == s1[j] && s2[i] != ' ') {
flag = 1;
break;
}
}
if(!flag) { //一轮比较后flag没变化,说明是一个错误选项
*max = ++p->wrong[s2[i]-'a'] > *max?p->wrong[s2[i]-'a']: *max;//记录选项错误次数最多的情况
res =1;
}
}
return res;
}
宇宙无敌加法器 (20 分)
Note:
- 结果最高位不可以是0;
- 如果结果是0要输出0;
- 两个数字相加的结果有可能大于两数字的长度;
- 两个数字,较短的数字高位补零用于继续和较长的数字计算。
#include<stdio.h>
#include<string.h>
int main() {
char s[30], num1[30], num2[30], res[30];
int d = 0;
int flag = 0;
scanf("%s\n%s\n%s", &s, &num1, &num2);
int i = strlen(s)-1;
int j = strlen(num1)-1;
int k = strlen(num2)-1;
int l = 29;
res[30] = '\0';//字符数组末尾加'\0'
for(; l >= 0; i--) {
int a, b, c = s[i] - '0';
if(c == 0)
c = 10;
a = j>=0?num1[j--]-'0':0;//当数组下标小于等于0,则用0继续计算
b = k>=0?num2[k--]-'0':0;//同上
res[l--] = (a+b+d)%c+'0';
d = (a+b+d)/c;//进位
}
for(i=0; res[i]!='\0'; i++) {
if(res[i]=='0' && !flag)//高位的0不可以输出
continue;
putchar(res[i]);
flag = 1;//一旦有个非零数字输出,flag置为1.之后的0就可以正常输出了
}
if(flag == 0)
putchar('0');
return 0;
}