第二次上机总结
问题
(先咕了) 多打点代码就熟练了
AC代码(非官方题解)
A test a xor b
- 签到题 送分题
- 异或用法和数据范围
#include <stdio.h>
int main(){
long long a,b;int n;
scanf("%d",&n);
while(n--){
scanf("%lld%lld",&a,&b);
printf("%lld
",a^b);
}
return 0;
}
B 五则运算
- 签到题 送分题
- 分支结构
if
和switch
的用法
#include <stdio.h>
int main(){
char calc[50] = {0};
while(fgets(calc,50,stdin)){
int a,b;char op;
sscanf(calc,"%d%c%d",&a,&op,&b);
switch(op){
case '+':
printf("%d
",a + b);
break;
case '-':
printf("%d
",a - b);
break;
case '*':
printf("%d
",a * b);
break;
case '/':
if(b == 0){
puts("WA");
}
else{
printf("%d
",a / b);
}
break;
case '%':
if(b == 0){
puts("WA");
}
else{
printf("%d
",a % b);
}
break;
default:
break;
}
}
return 0;
}
C 有理有据的送分
- 模拟可以做
- 这里给出我的思路 开数组 用
memset
模拟 最后统计
#include <stdio.h>
char buf[10010]={0};
int main(){
int m,n,i,j,cnt = 0;
memset(buf,1,10002);
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&i,&j);
memset(buf + i,0,(j - i + 1));
}
for(i = 1;i <= n;i++){
if(buf[i])cnt++;
}
printf("%d
",cnt);
return 0;
}
D 迷惑行为
- 数学函数 浮点数精度 数据范围
- 最后一组数据很坑
ps:小迷弟
的真正迷惑行为是一边debug
一边骂
#include <stdio.h>
#include <math.h>
int main(){
double a,b;
while(~scanf("%lf%lf",&a,&b)){
printf("%lld
",(long long)((log10(b) + 1e-9) / log10(a)));
}
return 0;
}
E 1917大班长(这是17系助教玩梗)
- 数组
- 开大数组计数,同时不停的记录最大值.
- 遍历整个数组即可找到所有最大值
- 千万别排序 会超时
#include <stdio.h>
#define MAX(a,b) (((a)>(b))?(a):(b))
int s[1000020] = {0};
int main(){
int n,cur,i,m = 0;
scanf("%d",&n);
while(~scanf("%d",&cur)){
s[cur]++;
m = MAX(m,s[cur]);
}
for(i = 1;i <= n;i++){
if(s[i] == m){
printf("%d %d
",i,s[i]);
}
}
return 0;
}
F 进制转换
- 进位制 数学问题
- 思路是提取出每一位然后反着输出
#include <stdio.h>
int main(){
int num,radix;
scanf("%d%d",&radix,&num);
int arr[32] = {0},i=0;
while(num){
arr[i] = num % radix;
num /= radix;
i++;
}
while(i--){
putchar(arr[i] + '0');
}
putchar('
');
return 0;
}
G ZYT学“真·位运算”
- 位运算
- 用"位与"和"移位"提取指定字节
- 用"位或"和"移位"把字节拼起来
#include <stdio.h>
#define GETBYTE0(i) ((i)&(0xff))
#define GETBYTE1(i) (((i)&(0xff00))>>8)
#define GETBYTE2(i) (((i)&(0xff0000))>>16)
#define GETBYTE3(i) (((i)&(0xff000000))>>24)
#define GETBYTE(x,i) (((x)&((0xff)<<(8*i)))>>(8*i))
int main(){
unsigned int n,m = 0;
scanf("%u",&n);
m |= GETBYTE(n,1);
m |= ((GETBYTE(n,0)) << 8);
m |= ((GETBYTE(n,3)) << 16);
m |= ((GETBYTE(n,2)) << 24);
printf("%u",m);
return 0;
}
H 朵朵买甜瓜
- 逻辑问题
- 枚举(如何把语言转化为代码是重点)
下面搬运官方题解
#include <stdio.h>
int main() {
int i, x[20] = {0};
for (i=1; i<=16; i++)
scanf("%d", &x[i]);
for (i=1; i<=4; i++) {
int w[5] = {0};
w[i] = 1;
if ((w[x[1]]==x[2]) + (w[x[3]]==x[4]) == 1 &&
(w[x[5]]==x[6]) + (w[x[7]]==x[8]) == 1 &&
(w[x[9]]==x[10]) + (w[x[11]]==x[12]) == 1 &&
(w[x[13]]==x[14]) + (w[x[15]]==x[16]) == 1)
printf("%d
", i);
}
return 0;
}