洛谷刷题:循环结构

今天这个,一天五道题,就是四天的成果了,打算用python和C写。
题目来源:https://www.luogu.com.cn/training/102#problems


一、【深基4.例2】找最小值

题目链接:https://www.luogu.com.cn/problem/P5718

题目描述

给出 n n n n n n 个整数 a i a_i ai,求这 n n n 个整数中最小值是什么。

输入格式

第一行输入一个正整数 n n n,表示数字个数。

第二行输入 n n n 个非负整数,表示 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2an,以空格隔开。

输出格式

输出一个非负整数,表示这 n n n 个非负整数中的最小值。

样例 #1

样例输入 #1

8
1 9 2 6 0 8 1 7

样例输出 #1

0

提示

数据保证, n ≤ 100 n\le100 n100 0 ≤ a i ≤ 1000 0\le a_i \le 1000 0ai1000

代码(python)

num = int(input())

a = list(map(int, input().split()))
a.sort()
print(a[0])

代码(C)

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

int main()
{
    
    
	int n;
	scanf("%d",&n);
	
	int min = 1000;
	for(int i = 1;i <= n;i++)
	{
    
    
		int num;
		scanf("%d",&num);
		if(num < min)
		{
    
    
			min = num;
		}
	}
	
	printf("%d\n",min);
	return 0;	
} 

二、【深基4.例3】分类平均

题目链接:https://www.luogu.com.cn/problem/P5719

题目描述

给定 n n n k k k,将从 1 到 n n n 之间的所有正整数可以分为两类:A 类数可以被 k k k 整除(也就是说是 k k k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 1 1 位,用空格隔开。

数据保证两类数的个数都不会是 0 0 0

输入格式

输入两个正整数 n n n k k k

扫描二维码关注公众号,回复: 16909631 查看本文章

输出格式

输出一行,两个实数,分别表示 A 类数与 B 类数的平均数。精确到小数点后一位。

样例 #1

样例输入 #1

100 16

样例输出 #1

56.0 50.1

提示

数据保证, 1 ≤ n ≤ 10000 1 \leq n\leq 10000 1n10000 1 ≤ k ≤ 100 1 \leq k \leq 100 1k100

代码(python)

# num = int(input())
#
# a = list(map(int, input().split()))
# a.sort()
# print(a[0])

n, k = map(int, input().split(" "))
i = 1
B_num = 0
B_sum = 0
A_num = 0
A_sum = 0
while i <= n:
    if i % k == 0:
        A_num += 1
        A_sum += i
        i += 1
    else:
        B_sum += i
        B_num += 1
        i += 1

print(round(A_sum/A_num, 1),round(B_sum/B_num, 1))

代码(C)

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

int main()
{
    
    
	int n, k;
	scanf("%d%d",&n,&k);
	
	int x = 0,y = 0;
	int sum = 0,num = 0;
	for(int i = 1;i <= n;i++)
	{
    
    
		if(i % k == 0)
		{
    
    
			sum = sum + i;
			x++;
		}
		if(i % k != 0)
		{
    
    
			num = num + i;
			y++;
		}
	}
	double a = 1.0*sum/x*1.0;
	double b = 1.0*num/y*1.0;
	printf("%.1lf %.1lf",a,b);
	return 0;	
} 

三、【深基4.例4】一尺之棰

题目链接:https://www.luogu.com.cn/problem/P5720

题目描述

《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a a a 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除 2 2 2,向下取整)。第几天的时候木棍的长度会变为 1 1 1

输入格式

输入一个正整数 a a a,表示木棍长度。

输出格式

输出一个正整数,表示要第几天的时候木棍长度会变为 1 1 1

样例 #1

样例输入 #1

100

样例输出 #1

7

提示

数据保证, 1 ≤ a ≤ 1 0 9 1 \le a\le 10^9 1a109

代码(python)

# num = int(input())
#
# a = list(map(int, input().split()))
# a.sort()
# print(a[0])
import math

n = int(input())
sum = 1
half = n
while half != 1:

    half = int(half / 2)
    sum += 1
print(sum)

代码(C)

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
    
    
	long long n;
	scanf("%lld",&n);
	
	int sum = 1;
	long long half = n;
	while(half !=1)
	{
    
    
			half = half/2;
			sum++;

		
	}
	
	printf("%d\n",sum);
	return 0;	
} 

四、【深基4.例6】数字直角三角形

题目链接:https://www.luogu.com.cn/problem/P5721

题目描述

给出 n n n,请输出一个直角边长度是 n n n 的数字直角三角形。所有数字都是 2 2 2 位组成的,如果没有 2 2 2 位则加上前导 0 0 0

输入格式

输入一个正整数 n n n

输出格式

输出如题目要求的数字直角三角形。

样例 #1

样例输入 #1

5

样例输出 #1

0102030405
06070809
101112
1314
15

提示

数据保证, 1 ≤ n ≤ 13 1\le n\le13 1n13

代码(python)

# num = int(input())
#
# a = list(map(int, input().split()))
# a.sort()
# print(a[0])
import math

n = int(input())
i = n
x = 1
while i >= 0:
    j = i - 1
    # print("i:",i)
    while j >= 0:
        # print("j:", j)
        if x < 10:
            print("0%d" % x, end="")
            x += 1
        else:
            print("%d" % x, end="")
            x += 1
        j -= 1
    print("")
    i -= 1

代码(C)

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
    
    
	int n;
	scanf("%d",&n);
	int x = 1;
	for(int i = n;i >= 0;i--)
	{
    
    
		for(int j = i-1;j >= 0;j--)
		{
    
    
			
			if(x < 10)
			{
    
    
				printf("0%d",x);
				x++;
			}
			else
			{
    
    
				printf("%d",x);
				x++;
			}
		}
		printf("\n");
	}
	return 0;	
} 

五、[NOIP1998 普及组] 阶乘之和

题目链接:https://www.luogu.com.cn/problem/P1009

题目描述

用高精度计算出 S = 1 ! + 2 ! + 3 ! + ⋯ + n ! S = 1! + 2! + 3! + \cdots + n! S=1!+2!+3!++n! n ≤ 50 n \le 50 n50)。

其中 ! 表示阶乘,定义为 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times 1 n!=n×(n1)×(n2)××1。例如, 5 ! = 5 × 4 × 3 × 2 × 1 = 120 5! = 5 \times 4 \times 3 \times 2 \times 1=120 5!=5×4×3×2×1=120

输入格式

一个正整数 n n n

输出格式

一个正整数 S S S,表示计算结果。

样例 #1

样例输入 #1

3

样例输出 #1

9

提示

【数据范围】

对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 50 1 \le n \le 50 1n50

【其他说明】

注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n ≤ 20 n \le 20 n20,使用书中的代码无法通过本题。

如果希望通过本题,请继续学习第八章高精度的知识。

代码(python)

n = int(input())
b = 0
for i in range(1, n + 1):
    c = i
    a = 1
    while c != 0:
        a = a * c
        c = c - 1
    b = b + a
print(b)

代码(C)

#include<stdio.h>
int main() {
    
    
	int n;
	int temp;
	int i, j;//进行阶乘和求和时的临时变量
	while(scanf("%d", &n)!=EOF){
    
    
		int m[100] = {
    
    0};//存储阶乘结果
		int num[1000] = {
    
    0};//存储求和结果
		int len = 1, count = 0, C = 0, D = 0;//len为阶乘结果的位数,count为求和结果的位数;C为求阶乘时的进位,D为求和时的进位
		m[0] = 1;//0的阶乘为1
		for (i = 1; i <= n; i++) {
    
    
			for (j = 0; j < len; j++) {
    
    
				temp = m[j];
				m[j] = (temp * i + C) % 10;
				C = (temp * i + C) / 10;
			}
			while (C != 0) {
    
    
				m[len] = C % 10;
				C = C / 10;
				len++;
			}//以上两个循环用来求阶乘结果
			for (count = 0; count < len; count++) {
    
    //求完阶乘直接加
				temp = num[count];
				num[count] = (temp + m[count] + D) % 10;
				D = (temp + m[count] + D) / 10;
			}
			while (D != 0) {
    
    
				m[count + 1] += D % 10;
				D = D / 10;
				count++;
			}//以上两个循环用来求阶乘之和结果
		}
		for (i = count - 1; i >= 0; i--) 
			printf("%d", num[i]);
			printf("\n");
	}
	return 0;
}

六、[NOIP2013 普及组] 计数问题

题目链接:https://www.luogu.com.cn/problem/P1980

题目描述

试计算在区间 1 1 1 n n n 的所有整数中,数字 x x x 0 ≤ x ≤ 9 0\le x\le9 0x9)共出现了多少次?例如,在 1 1 1 11 11 11 中,即在 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 1,2,3,4,5,6,7,8,9,10,11 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 1 1 出现了 4 4 4 次。

输入格式

2 2 2 个整数 n , x n,x n,x,之间用一个空格隔开。

输出格式

1 1 1 个整数,表示 x x x 出现的次数。

样例 #1

样例输入 #1

11 1

样例输出 #1

4

提示

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 6 1\le n\le 10^6 1n106 0 ≤ x ≤ 9 0\le x \le 9 0x9

代码(python)

n,x = list(map(int,input().split()))
# 计数的量
c = 0
# 整数序列
for i in range(1,n+1):
    # count() 计数
    c += str(i).count(str(x))
print(c)

代码(C)

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

int main(){
    
     
	int n, m;
	scanf("%d%d",&n,&m);
	int num, sum;
	for(int i = 1;i <= n;i++)
	{
    
    
		int pot = i;
		while(pot != 0)
		{
    
    
			num = pot%10;
			pot = pot/10;
			if(num == m)	sum++;
		}
	}
	
	printf("%d",sum);
	return 0;
}


七、[NOIP2002 普及组] 级数求和

题目链接:https://www.luogu.com.cn/problem/P1035

题目描述

已知: S n = 1 + 1 2 + 1 3 + … + 1 n S_n= 1+\dfrac{1}{2}+\dfrac{1}{3}+…+\dfrac{1}{n} Sn=1+21+31++n1。显然对于任意一个整数 k k k,当 n n n 足够大的时候, S n > k S_n>k Sn>k

现给出一个整数 k k k,要求计算出一个最小的 n n n,使得 S n > k S_n>k Sn>k

输入格式

一个正整数 k k k

输出格式

一个正整数 n n n

样例 #1

样例输入 #1

1

样例输出 #1

2

提示

【数据范围】

对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 15 1\le k \le 15 1k15

【题目来源】

NOIP 2002 普及组第一题

代码(python)


Sn = 0
k = int(input())
i = 1
while True:
    Sn = Sn+1.0/i
    if Sn > k:
        print(i)
        break
    i += 1

代码(C)

#include <stdio.h>
int main(){
    
    
    double Sn=0;
    int k;
    scanf("%d",&k);
    int i=1;
    while (1)
    {
    
    
        Sn = Sn+1.0/i;
        if(Sn>k)
        {
    
    
            printf("%d",i);
            break;
        }
        i++;
    }

八、[NOIP2015 普及组] 金币

题目链接:https://www.luogu.com.cn/problem/P2669

题目背景

NOIP2015 普及组 T1

题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 n n n 天每天收到 n n n 枚金币后,骑士会在之后的连续 n + 1 n+1 n+1 天里,每天收到 n + 1 n+1 n+1 枚金币。

请计算在前 k k k 天里,骑士一共获得了多少金币。

输入格式

一个正整数 k k k,表示发放金币的天数。

输出格式

一个正整数,即骑士收到的金币数。

样例 #1

样例输入 #1

6

样例输出 #1

14

样例 #2

样例输入 #2

1000

样例输出 #2

29820

提示

【样例 1 说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1 + 2 + 2 + 3 + 3 + 3 = 14 1+2+2+3+3+3=14 1+2+2+3+3+3=14 枚金币。

对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 1 0 4 1\le k\le 10^4 1k104

代码(python)

k = int(input())
n,m = 1,0
while k > 0:
    k -= n
    if k > 0:
        m += n*n
        n += 1
    else:
        m += n*(k+n)
print(m)

代码(C)

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int sqr[101];
int app[20001];

int main()
{
    
    
    int k;//k天
	scanf("%d",&k);
	int num = 0;
	int n = 0;
	while(k > num)
	{
    
    	
		n++;
		num = (n+1)*n/2;
		
	} 
	long long sum = 0;
	if(num != k){
    
    
		for(int i = 1;i < n;i++)
		{
    
    
			sum = sum + i*i;
		}
		int m = (n-1)*n/2;
		sum = (k - m)*n + sum;
		printf("%lld\n",sum);
	}
	else if(num == k)
	{
    
    
		for(int i = 1;i <= n;i++)
		{
    
    
			sum = sum + i*i;
		}
		printf("%d\n",sum);
	}
	
	
    return 0;
}

九、【深基4.例11】数列求和

题目链接:https://www.luogu.com.cn/problem/P5722

题目描述

计算 1 + 2 + 3 + ⋯ + ( n − 1 ) + n 1+2+3+\cdots+(n-1)+n 1+2+3++(n1)+n 的值,其中正整数 n n n 不大于 100。由于你没有高斯聪明,所以你不被允许使用等差数列求和公式直接求出答案。

输入格式

输入一个正整数 n n n

输出格式

输出一个正整数,表示最后求和的答案。

样例 #1

样例输入 #1

100

样例输出 #1

5050

提示

数据保证, 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100

代码(python)

n = int(input())
sum1 = 0
for i in range(1, n+1):
    sum1 = sum1 + i

print(sum1)

代码(C)

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
    
    
	int n;
	scanf("%d",&n);
	
	int sum = 0;
	for(int i = 1;i <= n;i++)
	{
    
    
		sum = sum + i;
	}
	
	printf("%d",sum);
	return 0;	
} 

十、【深基4.例13】质数口袋

题目链接:https://www.luogu.com.cn/problem/P5723

题目描述

小 A 有一个质数口袋,里面可以装各个质数。他从 2 2 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。

口袋的负载量就是口袋里的所有数字之和。

但是口袋的承重量有限,装的质数的和不能超过 L L L。给出 L L L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。

输入格式

一行一个正整数 L L L

输出格式

将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。

样例 #1

样例输入 #1

100

样例输出 #1

2
3
5
7
11
13
17
19
23
9

样例 #2

样例输入 #2

5

样例输出 #2

2
3
2

样例 #3

样例输入 #3

11

样例输出 #3

2
3
5
3

提示

数据保证, 1 ≤ L ≤ 10 5 1 \le L \le {10}^5 1L105

代码(python)


lena = 0
cnt = 0
prime = [1 for i in range(100010)]
lena = int(input())
prime[1] = 0
prime[0] = 0
for i in range(2, 100010):

    if prime[i] == 1:

        j = i * 2
        while j < 100010:
            prime[j] = 0
            j += i

for i in range(2, 100010):

    if prime[i] == 1:
        if lena >= i:

            print(i)

            lena -= i

            cnt += 1
        else:
            break

print(cnt)


代码(C)

#include <stdio.h>
#include <stdlib.h>

int n,x;
long long sum=0;
int pd(int y) {
    
    
	int i;
	for(i=2; i*i<=y; ++i) {
    
    
		if(y%i==0) return 0;
	}
	return 1;
}
int main() {
    
    
	scanf("%d",&n);
	if(n<2) {
    
    
		printf("0\n");
		return 0;
	} else if(n==2) {
    
    
		printf("2\n1\n");
		return 0;
	}
	int i;
	for(i=2; i<=n; ++i) {
    
    
		if(i%2==0&&i!=2) continue;
		if(sum+i>n) {
    
    
			printf("%d\n",x);
			return 0;
		}
		if(pd(i)) {
    
    
			printf("%d\n",i);
			sum+=i;
			x++;
		}
	}
	return 0;
}

十一、[USACO1.5] 回文质数 Prime Palindromes

题目链接:https://www.luogu.com.cn/problem/P1217

题目描述

因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 151 是回文质数。

写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000) [a,b](5a<b100,000,000)(一亿)间的所有回文质数。

输入格式

第一行输入两个正整数 a a a b b b

输出格式

输出一个回文质数的列表,一行一个。

样例 #1

样例输入 #1

5 500

样例输出 #1

5
7
11
101
131
151
181
191
313
353
373
383

提示

Hint 1: Generate the palindromes and see if they are prime.

提示 1: 找出所有的回文数再判断它们是不是质数(素数).

Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.

提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

题目翻译来自NOCOW。

USACO Training Section 1.5

产生长度为 5 5 5 的回文数:

for (d1 = 1; d1 <= 9; d1+=2) {
    
        // 只有奇数才会是素数
     for (d2 = 0; d2 <= 9; d2++) {
    
    
         for (d3 = 0; d3 <= 9; d3++) {
    
    
           palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
         }
     }
 }

代码(python)


# 输入范围
begin, end = map(int, input().split())


# 定义一个筛选素数的函数,时间复杂度为根号n/3
def prime_number(number):
    if number <= 3:
        return True
    elif number % 2 == 0 or number % 3 == 0:
        return False
    else:
        i = 5
        while i * i <= number:
            if number % i == 0 or number % (i + 2) == 0:
                return False
            i += 6
    return True


# 定义生成回文数的函数
from itertools import product


def palind(n):
    digit_palind = []
    half = product(*([range(1, 10, 2)] + [range(10)] * ((n - 1) // 2)))
    for i in half:
        digit_palind.append(n * '%s' % tuple(list(i) + list(i[-(n % 2) - 1::-1])))
    return digit_palind


# 判断终点的数位
numerical_digit = 1
while 10 ** numerical_digit < end:
    numerical_digit += 1
for i in range(1, numerical_digit + 1):
    for str_num in palind(i):
        num = int(str_num)
        if num >= begin and num <= end and prime_number(num):
            print(num)

代码(C-88分)

#include <stdio.h>
#include <stdlib.h>


long long a,b;
//判断是否是质数 
int pd(long long y) {
    
    
	long long i;
	for(i=2; i*i<=y; ++i) {
    
    
		if(y%i==0) return 0;
	}
	return 1;
}

//判断是否是回文数
int hui(long long n)
{
    
    
	long long num  = n;
	long long m = 0, a;
		while(1){
    
    
			a = n%10;
			m = m*10 + a;
			n = n/10; 
			if( n == 0){
    
    
				break;
			}
		}
	if(m == num)
		return 1;
	else
		return 0; 
	
 } 
 
 
int main()
{
    
    
	scanf("%d %d",&a,&b);
	long long i = a;
	if(a%2 ==0)
		a ++;
	for(i = a;i <= b;i+=2)
	{
    
    

		if(i%3 != 0)
		{
    
    
			int y = hui(i);
			if(y == 1)
			{
    
    
				int x = pd(i);
				if(x ==1)
					printf("%lld\n",i);
			}
		}
		
	}
	return 0;
}

代码(C-100)

#include<stdio.h>
#include<math.h>
int prime(int n) {
    
    //判定素数 
	if(n==1)//特判1 
		return 0;
	if(n%2==0)//2的倍数就回家吧 
		return 0;
	else {
    
    //不然就暴力枚举 
		int i;
		for(i=2; i<=sqrt(n); i++) {
    
    
			if(n%i==0)
				return 0;
		}
		return 1;
	}
}
int hw(int n) {
    
    //判定回文,不懂请参考数字反转 
	int sum=0;
	int k=n;
	while(n!=0) {
    
    
		sum=sum*10+n%10;
		n/=10;
	}
	if(sum==k)//判断是否回文 
		return 1;
	else
		return 0;
}
int main() {
    
    
	int i,n,sum=0,m;
	scanf("%d %d",&n,&m);  //读入两个数 
	for(i=n; i<=m; i++) {
    
    
		if(i==9989900) //如果到了这个数,就break 
			break;
		if(hw(i)&&prime(i))//否则判断是否回文和素数 
			printf("%d\n",i);//输出每个回文质数 
	}
	return 0;//结束程序 
}

十二、小玉在游泳

题目链接:https://www.luogu.com.cn/problem/P1423

题目描述

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 2 2 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98 % 98\% 98%。现在小玉想知道,如果要游到距离 s s s 米的地方,她需要游多少步呢。请你编程解决这个问题。

输入格式

输入一个实数 s s s(单位:米),表示要游的目标距离。

输出格式

输出一个整数,表示小玉一共需要游多少步。

样例 #1

样例输入 #1

4.3

样例输出 #1

3

提示

数据保证, 0 ≤ s < 100 0 \leq s < 100 0s<100,且 s s s 小数点后最多只有一位。

代码(python)

s = float(input())

num = 0
step = 2
while s > 0:
    s = s - step
    step = step *0.98
    num += 1
print(num)

代码(C)


#include<stdio.h>
int main()
{
    
    
    float a,b=2,k=2;/*距离可能非整*/
    int i=1;/*由于数据弱就int即可*/
    scanf("%f",&a);/*输入目标*/
    for(i=1;i<=99999999;i++)
    {
    
    if(k>a) break;/*判断是否游到目标*/
     else 
     {
    
    
          b=b*0.98;/*每步能游的距离*/
          k=b+k;/*每步结束后的已游总距离*/
      }}
     printf("%d",i);/*输出步数*/
     return 0;
}

十三、[NOIP2011 普及组] 数字反转

题目链接:https://www.luogu.com.cn/problem/P1307

题目描述

给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

输入格式

一个整数 N N N

输出格式

一个整数,表示反转后的新数。

样例 #1

样例输入 #1

123

样例输出 #1

321

样例 #2

样例输入 #2

-380

样例输出 #2

-83

提示

【数据范围】

$-1,000,000,000\leq N\leq 1,000,000,000 $。

noip2011 普及组第一题

代码(python)

num = input()

if num[0] == "-":
    print("-", end="")
    print(int(num[:0:-1]))
else:
    print(int(num[::-1]))


代码(C)

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    
    
	int n;
	while(scanf("%d",&n)!=EOF){
    
    
	int m = 0, a;
		while(1){
    
    
			a = n%10;
			m = m*10 + a;
			n = n/10; 
			if( n == 0){
    
    
				break;
			}
		}
		printf("%d\n",m);
	} 
	return 0;
}

十四、月落乌啼算钱(斐波那契数列)

题目链接:https://www.luogu.com.cn/problem/P1720

题目背景

(本道题目木有隐藏歌曲……不用猜了……)

《爱与愁的故事第一弹·heartache》最终章。

吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……

题目描述

算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 n n n 样菜价格多少?”月落乌啼写出了:

F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}} Fn=5 (21+5 )n(215 )n

由于爱与愁大神学过编程,于是就用 1 1 1 分钟的时间求出了 F n F_n Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 F n F_n Fn 的值吗?

输入格式

一行一个自然数 n n n

输出格式

只有 1 1 1 行一个实数 F n F_n Fn,保留两位小数。

样例 #1

样例输入 #1

6

样例输出 #1

8.00

提示

对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0n48

代码(python)

import math



def jia( n ):
    num = float((1 + math.sqrt(5)) / 2)
    sum = 1
    while n > 0:
        sum = float(sum * num)
        n -= 1
    return sum

def jian( n ):
    num = float((1 - math.sqrt(5)) / 2)
    sum = 1
    while n > 0:
        sum = float(sum * num)
        n -= 1
    return sum

if __name__ == '__main__':
    n = int(input())
    a = jia(n)
    b = jian(n)
    num = float((a-b)/math.sqrt(5))
    # print(round(num,3))

    print("{:.2f}".format(num))


代码(C)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//函数
double  HANSHU(int n){
    
    
	double num = (pow(((1 + sqrt(5.0))/2.0),n) - (pow(((1 - sqrt(5.0))/2.0),n)))/sqrt(5.0);
	return num;
} 
int main(int argc, char *argv[]) {
    
    
	int n;
	while(scanf("%d",&n)!=EOF){
    
    
		double num;
		num = HANSHU(n);
		printf("%.2lf\n",num);
	}
	return 0;
}

十五、【深基4.习5】求极差 / 最大跨度值

题目链接:https://www.luogu.com.cn/problem/P5724

题目描述

给出 n n n n n n 个整数 a i a_i ai,求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

输入格式

第一行输入一个正整数 n n n,表示整数个数。

第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2an,以空格隔开。

输出格式

输出一个整数,表示这 n n n 个整数的极差。

样例 #1

样例输入 #1

6
4 1 5 1 4 1

样例输出 #1

4

提示

数据保证, 1 ≤ n ≤ 100 1 \leq n\leq 100 1n100 0 ≤ a i ≤ 1000 0\le a_i \le 1000 0ai1000

代码(python)

n = int(input())

num = list(input().split(" "))

max1 = int(num[0])
min1 = int(num[0])
for i in range(0,n-1):
    if int(num[i]) > max1:
        max1 = int(num[i])
    if int(num[i]) < min1:
        min1 = int(num[i])

print(max1 - min1)

代码(C)

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
    
    
	int n;
	scanf("%d",&n);
	
	int min = 1000, max = 1;
	
	for(int i = 1;i <= n;i++)
	{
    
    
		int num;
		scanf("%d",&num);
		if(num < min)
		{
    
    
			min = num;
		}
		if(num > max)
		{
    
    
			max = num;
		}
	}
	
	printf("%d",max - min);	
	return 0;	
} 

十六、最长连号

题目链接:https://www.luogu.com.cn/problem/P1420

题目描述

输入长度为 n n n 的一个正整数序列,要求输出序列中最长连号的长度。

连号指在序列中,从小到大的连续自然数。

输入格式

第一行,一个整数 n n n

第二行, n n n 个整数 a i a_i ai,之间用空格隔开。

输出格式

一个数,最长连号的个数。

样例 #1

样例输入 #1

10
1 5 6 2 3 4 5 6 8 9

样例输出 #1

5

提示

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 4 1 \leq n \leq 10^4 1n104 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

代码(python)

maxn = 0
n = int(input())
a = list(map(int, input().split()))
lena = len(a)

for i in range(n):
    s = 0
    for j in range(i + 1, n):
        if a[j] == a[j - 1] + 1:
            s += 1
        else:
            break
    maxn = max(maxn, s)

print(maxn + 1)


代码(C)

#include <stdio.h>
#include <stdlib.h>
#define M 10000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    
    
	int n, i, j, count = 0,sum = 0;
	scanf("%d",&n);
	long long int NUM[M];
	for(i = 0;i < n;i++){
    
    
		scanf("%lld",&NUM[i]);
	}
		for(j = 0;j <= n;j++){
    
    
			if(NUM[j] == NUM[j+1] - 1){
    
    
				count++;
				if(count > sum)
					sum = count;
			}
			else count = 0;		
		}

	printf("%d\n",sum+1);
	return 0;
}

十七、[NOIP2012 普及组] 质因数分解

题目链接:https://www.luogu.com.cn/problem/P1075

题目描述

已知正整数 n n n 是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入格式

输入一个正整数 n n n

输出格式

输出一个正整数 p p p,即较大的那个质数。

样例 #1

样例输入 #1

21

样例输出 #1

7

提示

1 ≤ n ≤ 2 × 1 0 9 1 \le n\le 2\times 10^9 1n2×109

NOIP 2012 普及组 第一题

代码(python)

n = int(input())
m = 2
while n % m != 0:
    m += 1
p = int(n / m)
if p <= m:
    p = m
print(p)

代码(C)

#include <stdio.h>

int main()
{
    
    
	int n;
	scanf("%d",&n);
	int m = 2;
	while(n%m != 0)
	{
    
    
		m++;
	}
	int p = n/m;
	if(p <= m) p = m;
	printf("%d",p); 
	return 0;
}

十八、【深基4.习8】求三角形

题目链接:https://www.luogu.com.cn/problem/P5725

题目描述

模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。

输入格式

输入矩阵的规模,不超过 9 9 9

输出格式

输出矩形和正方形

样例 #1

样例输入 #1

4

样例输出 #1

01020304
05060708
09101112
13141516

      01
    0203
  040506
07080910

代码(python)


cnt = 0

n = int(input())

i = 1

while i <= n * n:
    if i % n == 1 and i != 1:
        print()
        # print("\n")

    if i < 10:
        print("0", end="")

    print(i, end="")

    i += 1

print()
print()
# print("\n\n")

i = 2 * n

while i > 0:
    i -= 2
    for j in range(i):
        print(" ", end="")

    j = 0
    while j < (2 * n - i) // 2:
        cnt += 1
        if cnt < 10:
            print("0", end="")

        print("%d" % cnt, end="")

        j += 1

    print()
    # print("\n")

代码(C)

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
    
    
	int n;
	scanf("%d",&n);
	
	int x = 1; 
	for(int i = 1;i <= n;i++)
	{
    
    
		for(int j = 1;j <= n;j++)
		{
    
    
			if(x < 10)
			{
    
    
				printf("0%d",x);
				x++;
			}
			else
			{
    
    
				printf("%d",x);
				x++;
			}
		}
		printf("\n");
	}
	
	printf("\n");
	int m = 1;
	for(int i = n-1;i >= 0;i--)
	{
    
    
		for(int j = 0;j < i;j++)
		{
    
    
			printf("  ");
		}
		for(int t = i;t <= n-1;t++)
		{
    
    
			if(m < 10)
			{
    
    
				printf("0%d",m);
				m++;
			}
			else 
			{
    
    
				printf("%d",m);
				m++;
			}
		}
		printf("\n");
	}
	return 0;	
} 

十九、【深基4.习9】打分

题目描述

现在有 n ( n ≤ 1000 ) n(n \le 1000) n(n1000) 位评委给选手打分,分值从 0 0 0 10 10 10。需要去掉一个最高分,去掉一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分。现在输入评委人数和他们的打分,请输出选手的最后得分,精确到 2 2 2 位小数。

输入格式

第一行输入一个正整数 n n n,表示有 n n n 个评委。

第二行输入 n n n 个正整数,第 i i i 个正整数表示第 i i i 个评委打出的分值。

输出格式

输出一行一个两位小数,表示选手的最后得分。

样例 #1

样例输入 #1

5
9 5 6 8 9

样例输出 #1

7.67

提示

数据保证, 3 ≤ n ≤ 1000 3 \leq n \leq 1000 3n1000,每个评委打出的分值为为 0 0 0 10 10 10(含 0 0 0 10 10 10)之间的整数。

代码(python)

n = int(input())
grades = list(map(int, input().split()))

new = sorted(grades)
sum = 0
for i in range (1,n-1):
    sum = sum + new[i]
print(float(round(sum/(n-2),2)))

二十、[COCI2017-2018#6] Davor

题目链接:https://www.luogu.com.cn/problem/P4956

题面翻译

在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。他将在 2018 2018 2018 12 12 12 31 31 31 日开始出发,在这之前需要一共筹集 n n n 元钱。他打算在每个星期一筹集 x x x 元,星期二筹集 x + k x+k x+k 元,……,星期日筹集 x + 6 k x+6k x+6k 元,并连续筹集 52 52 52 个星期。其中 x , k x,k x,k 为正整数,并且满足 1 ≤ x ≤ 100 1 \le x \le 100 1x100

现在请你帮忙计算 x , k x,k x,k 为多少时,能刚好筹集 n n n 元。

如果有多个答案,输出 x x x 尽可能大, k k k 尽可能小的。注意 k k k 必须大于 0 0 0

题目描述

After successfully conquering the South Pole, Davor is preparing for new challenges. Next up is the Arctic expedition to Siberia, Greenland and Norway. He begins his travels on 31 December 2018, and needs to collect ​N kunas (Croatian currency) by then. In order to do this, he has decided to put away ​X (​X ≤ 100) kunas every Monday to his travel fund, ​X + K kunas every Tuesday, ​X + 2* ​K every Wednesday, and so on until Sunday, when he will put away ​X + 6* ​K kunas. This way, he will collect money for 52 weeks, starting with 1 January 2018 (Monday) until 30 December 2018 (Sunday).

If we know the amount of money ​N​, output the values ​X and ​K so that it is possible to collect the ​exact money amount in the given timespan. The solution will always exist, and if there are multiple, output the one with the greatest ​X ​ and smallest ​K ​.

输入格式

The first line of input contains the integer ​N​ (1456 ≤ ​N​ ≤ 145600), the number from the task.

输出格式

The first line of output must contain the value of ​X (​0 < ​X ​≤ 100 ​)​, and the second the value of
K (K ​> 0 ​)​.

样例 #1

样例输入 #1

1456

样例输出 #1

1
1

样例 #2

样例输入 #2

6188

样例输出 #2

14
1

样例 #3

样例输入 #3

40404

样例输出 #3

99
4

代码(python)


num  = int(input())

n = 1
k = 1
price = int(num / 364)
n = price - 3 * k
k += 1
while n > 100:
    n = price - 3 * k
    k += 1

print(n)
print(k - 1)

代码(C)

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

int main()

{
    
    
	int n, k = 1;
	long long num;
	scanf("%lld",&num);
	
	int price = num / 364;
	do
	{
    
    
		n = price - 3*k;
		k++;
	}
	while(n > 100);
	
	printf("%d\n",n);
	printf("%d\n",k - 1);
	return 0;
}

二十一、[NOIP2004 提高组] 津津的储蓄计划

题目链接:https://www.luogu.com.cn/problem/P1089

题目描述

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20 % 20\% 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 100 100 元或恰好 100 100 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如 11 11 11月初津津手中还有 83 83 83 元,妈妈给了津津 300 300 300 元。津津预计 11 11 11月的花销是 180 180 180 元,那么她就会在妈妈那里存 200 200 200 元,自己留下 183 183 183 元。到了 11 11 11 月月末,津津手中会剩下 3 3 3 元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据 2004 2004 2004 1 1 1 月到 12 12 12 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 2004 2004 年年末,妈妈将津津平常存的钱加上 20 % 20\% 20% 还给津津之后,津津手中会有多少钱。

输入格式

12 12 12 行数据,每行包含一个小于 350 350 350 的非负整数,分别表示 1 1 1 月到 12 12 12 月津津的预算。

输出格式

一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 − X -X X X X X 表示出现这种情况的第一个月;否则输出到 2004 2004 2004 年年末津津手中会有多少钱。

注意,洛谷不需要进行文件输入输出,而是标准输入输出。

样例 #1

样例输入 #1

290
230
280
200
300
170
340
50 
90 
80 
200
60

样例输出 #1

-7

样例 #2

样例输入 #2

290 
230 
280 
200 
300 
170 
330 
50 
90 
80 
200 
60

样例输出 #2

1580

代码(python)

x = 0
y = 0
save = 0
flag = 1
month = 0
for i in range(1, 13):
    x += 300
    y = int(input())
    x -= y
    if (x < 0):
        flag = 0
        month = i
        break
    save += int(x / 100)
    x = x % 100
if (flag == 1):
    print(120 * save + x)
else:
    print(-month)

代码(C)


#include <stdio.h>
int main()
{
    
    
    int n;
    int sum = 0;	        //初始化,用于记录每个月剩余有多少钱
    int sum0 = 0;	        //如果中间没有出现缺钱的情况,那么就用这个sum0来存储每个月在妈妈手里有多少钞票
    for (int i = 1; i <= 12; i++) //一年十二个月,不多做解释了
    {
    
    
        sum += 300;     //妈妈给钱
        scanf("%d", &n);
        sum = sum - n;
        if (sum < 0)     //如果消费大于开支则为负数,直接输出ok
        {
    
    
            printf("-%d\n", i); //特别注意负号
            return 0;
        }
        else
            sum0 += sum / 100 * 100; //如果不是就往妈妈手里存钱
        sum = sum - sum / 100 * 100; //每个孩子手里剩余多少钱
    }
    printf("%d\n", sum0 * 12 / 10 + sum); //如果上述未有输出,那么就可以打印输出多少钱了
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_62529383/article/details/133237280
今日推荐