Bootstrap

Day3 洛谷Day3 1161+1179+1200+1304

零基础洛谷刷题记录

Day1 2024.11.18
Day2 2024.11.25
Day3 2024.11.26



开灯

1161:题目描述

在一条无限长的路上,有一排无限长的路灯,编号为 1,2,3,4,…。

每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。

在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:
指定两个数,a,t(a 为实数,t 为正整数)。将编号为 ⌊a⌋,⌊2×a⌋,⌊3×a⌋,…,⌊t×a⌋ 的灯的开关各按一次。其中 ⌊k⌋ 表示实数 k 的整数部分。

在小明进行了 n 次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。

幸好,小明还记得之前的 n 次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?

1161:解题代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n;
	static int arr[5000000];
	for (int i = 1; i < 5000000; i++)
	{
		arr[i] = 0;
	}
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		double a;
		int t;
		scanf("%lf %d", &a, &t);

		for (int j = 1; j <= t; j++)
		{
			if (arr[(int)(a * j)] == 1)
			{
				arr[(int)(a * j)] = 0;
				continue;
			}
			arr[(int)(a * j)] = 1;
		}
	}
	for (int i = 1; i < 5000000; i++)
	{
		if (arr[i] == 1)
		{
			printf("%d\n", i);
			return 0;
		}
	}
}

1161:学习成果

  • (1)在数组前面+static可以解决长期以来由于数组太大而被vs提醒的问题
  • (2)原理:将数组从栈堆数据段挪道全局数据段即可避开超出默认栈堆大小导致程序无法正常运行的问题
  • (3)对于小数的计算,用double比用float精确的多

数字统计

1179:题目描述(成功写出)

1179:解题代码

请统计某个给定范围 [L,R] 的所有整数中,数字 2 出现的次数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int left;
	int right;
	scanf("%d %d", &left, &right);
	int count = 0;

	for (int i = left; i <= right; i++)
	{
		int j = i;
		while (j != 0)
		{
			int k = j % 10;
			j /= 10;
			if (k == 2)
			{
				count++;
			}
		}
	}
	printf("%d\n",count);
	return 0; 
}

1179:学习成果

  • 知道如何取出一个数的各位数字即可

你的飞碟在这儿

1200:题目描述(成功写出)

众所周知,在每一个彗星后都有一只 UFO。这些 UFO 时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的 UFO 带走。

小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中 USACO 小组就是 21×19×1×3×15=17955。如果小组的数字 mod47 等于彗星的数字 mod47,你就得告诉这个小组需要准备好被带走!(记住“a mod b”是 a 除以 b 的余数,例如:34mod10 等于 4写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出 GO,否则输出 STAY。小组名和彗星名均是没有空格或标点的一串大写字母(不超过 6 个字母)。

1200:解答代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	static char arr[6];
	scanf("%s",arr);
	static char arr_2[6];
	scanf("%s", arr_2);

	int sum = 1;
	for (int i = 0; i < 6 && arr[i] != '\0'; i++)
	{
		int k = (int)arr[i] - 64;
		sum *= k;
	}
	int answer_1 = sum % 47;
	sum = 1;
	for (int i = 0; i < 6&&arr_2[i]!='\0'; i++)
	{
		int k = (int)arr_2[i] - 64;
		sum *= k;
	}
	int answer_2 = sum % 47;
	if (answer_1 == answer_2)
	{
		printf("GO\n");
	 }
	else
	{
		printf("STAY\n");
	}
	return 0; 
}

1200:学习成果

  • 细节决定成败!

哥德巴赫猜想

1304:题目描述(成功写出)

输入一个偶数 N,验证 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10=3+7=5+5,则 10=5+5 是错误答案。

1304:解答代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int zhishu(int a)
{
	int i;
	for (i = 2; i < a; i++)
	{
		if (a % i == 0)
		{
			break;
		}
	}
	if (i == a)
	{
		return 1;
	}
	return 0;
}
int main()
{
	int add;
	scanf("%d", &add);

	for (int i = 4; i <= add; i += 2)
	{
		for (int j = 2;; j++)
		{
			if (zhishu(j)==1 && zhishu(i - j) == 1)
			{
				printf("%d=%d+%d\n", i, j, i - j);
				break;
			}
		}
	}
	return 0; 
}

1304:学习成果

  • 果真细节决定成败
  • 合理创建其他函数

;