第二次上机总结

第二次上机总结

问题

(先咕了) 多打点代码就熟练了

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 五则运算

  • 签到题 送分题
  • 分支结构 ifswitch的用法
#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;
}
原文地址:https://www.cnblogs.com/woshilxcdexuesheng/p/14579953.html