第一场周赛题解(C)

admin 发布于 2025-10-21 925 字 385 次阅读


这场比赛非常简单对比我上一届第一场周赛来说,要想成为一个高手一定要勤补题。

A.简单的签到题

#include<stdio.h>

int main(){
    printf("美人不我期,Cia木日零llo~(∠·ω< )⌒★。\n");
}

B.简单的打印

遍历一遍即可,记得要换行

#include<stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        printf("Hello World\n");
    }
}

C.数组

把答案放入数组里,反向遍历一遍就行

#include <stdio.h>
int a[105]; // 开全局变量好一些
int main(){
	int n;
	scanf("%d",&n);
	for (int i = 1; i <= n; i++){
		scanf("%d",&a[i]);
	}
	for (int i = n; i >= 1; i--){
		printf("%d ",a[i]);
	}
}

可以学下递归写法

#include <stdio.h>
int a[105];
int n;

void f(int t){
 	if (t == n + 1) return;
 	f(t + 1);
 	printf("%d ", a[t]);
}

int main() {
	scanf("%d", &n);
 	for (int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
	}
	f(1);
}

D.数学

1到n每个数都判断一遍是否为3的倍数即可;

#include<stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    int cnt = 0;
    for (int i = 1; i <= n; i++){
        if (i % 3 == 0) cnt++; 
    }
    printf("%d",cnt);
}

有更简单的写法

#include<stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    printf("%d",n / 3);
}

E小曾学长的数学

sqrt()是math库的函数可以开根

用海伦公式就行, 两点间的距离就是欧几里得距离公式

#include <stdio.h>
#include <math.h>

double f(double x1, double y1, double x2, double y2){
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
	double x1, y1, x2, y2, x3, y3;
	scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
	double a = f(x1,y1,x2,y2);
	double b = f(x2,y2,x3,y3);
	double c = f(x1,y1,x3,y3);
	double p = (a + b + c) / 2.0;
	double ans = sqrt(p * (p - a) * (p - b) * (p - c));
	printf("%.3lf",ans);
}

F.排序

冒泡排序

#include <stdio.h>
const int N = 1005;
long long a[N];

int main() {
	int n;
	scanf("%d", &n);
	if (n <= 0){
		puts("-1");
		return 0;
	}
	for (int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
	}
    for(int i=1;i<=n;i++){
    	for(int j=i;j>=2;j--){
    		if(a[j]<a[j-1]){
		        long long c = a[j - 1];
			a[j - 1] = a[j];
                        a[j] = c;
		}
    		else break;
	}
    }
	for (int i = 1; i <= n; i++) printf("%lld ", a[i]);
}

快排写法 时间更快

#include<stdio.h>
const int N = 1005;
long long a[N];
void quick_sort(long long q[], int l, int r){
	if (l >= r) return;
	long long x = q[l + r >> 1];
	int i = l - 1, j = r + 1;
	while(i < j){
		do i++; while(q[i] < x);
		do j--; while(q[j] > x);
		if (i < j){
			long long c = q[i];
			q[i] = q[j];
			q[j] = c;
		}
	}
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

int main(){
	int n;
	scanf("%d", &n);
	if (n <= 0){
		puts("-1");
		return 0;
	}
	for (int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
	}
	quick_sort(a,1,n);
	for (int i = 1; i <= n; i++) printf("%lld ", a[i]);
}

G.找不同

遍历数组,不断更新最大值;

用个数组来记录每个元素是否存在,存在就用1表示.

#include<stdio.h>
const int N = 1005;
int a[N], cnt[N];
int n;

int main(){
    scanf("%d",&n);
    int max = 0;
    for (int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
        cnt[a[i]] = 1;
        if (a[i] > max) max = a[i];
    }
    int ans = 0;
    for (int i = 0; i < max; i++){
        if (cnt[i]) ans++;
    }
    printf("%d", ans);
}

H.数字分解

当一个数字可以被分解为2^x*3^y时,说明该数的质因子只包含2和3;

当该数字将自身包含的2和3除完后不是1则它还有其他质因子;

#include <stdio.h>

int main() {
    long long n;
    scanf("%lld", &n);
    while(n % 2 == 0) n /= 2;
    while(n % 3 == 0) n /= 3;
    if (n == 1) puts("Yes");
    else puts("No");
    
}
最后更新于 2025-10-23