• 洛谷刷题:循环结构


    今天这个,一天五道题,就是四天的成果了,打算用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
    • 2

    样例输出 #1

    0
    
    • 1

    提示

    数据保证, 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])
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码(C)

    #include
    #include
    #include
    #include 
    
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    二、【深基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

    输出格式

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

    样例 #1

    样例输入 #1

    100 16
    
    • 1

    样例输出 #1

    56.0 50.1
    
    • 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))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    代码(C)

    #include
    #include
    #include
    #include 
    
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    三、【深基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

    样例输出 #1

    7
    
    • 1

    提示

    数据保证, 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    代码(C)

    #include
    #include
    #include
    #include 
     
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    四、【深基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

    样例输出 #1

    0102030405
    06070809
    101112
    1314
    15
    
    • 1
    • 2
    • 3
    • 4
    • 5

    提示

    数据保证, 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    代码(C)

    #include
    #include
    #include
    #include 
     
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    五、[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

    样例输出 #1

    9
    
    • 1

    提示

    【数据范围】

    对于 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码(C)

    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    六、[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

    样例输出 #1

    4
    
    • 1

    提示

    对于 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码(C)

    #include
    #include
    #include
    #include 
    
    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;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    七、[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

    样例输出 #1

    2
    
    • 1

    提示

    【数据范围】

    对于 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码(C)

    #include 
    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++;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    八、[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

    样例输出 #1

    14
    
    • 1

    样例 #2

    样例输入 #2

    1000
    
    • 1

    样例输出 #2

    29820
    
    • 1

    提示

    【样例 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码(C)

    #include
    #include
    #include
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    九、【深基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

    样例输出 #1

    5050
    
    • 1

    提示

    数据保证, 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    代码(C)

    #include
    #include
    #include
    #include 
     
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    十、【深基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

    样例输出 #1

    2
    3
    5
    7
    11
    13
    17
    19
    23
    9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    样例 #2

    样例输入 #2

    5
    
    • 1

    样例输出 #2

    2
    3
    2
    
    • 1
    • 2
    • 3

    样例 #3

    样例输入 #3

    11
    
    • 1

    样例输出 #3

    2
    3
    5
    3
    
    • 1
    • 2
    • 3
    • 4

    提示

    数据保证, 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)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    代码(C)

    #include 
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    十一、[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

    样例输出 #1

    5
    7
    11
    101
    131
    151
    181
    191
    313
    353
    373
    383
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    提示

    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;//(处理回文数...)
             }
         }
     }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码(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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    代码(C-88分)

    #include 
    #include 
    
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    代码(C-100)

    #include
    #include
    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;//结束程序 
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    十二、小玉在游泳

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

    题目描述

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

    输入格式

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

    输出格式

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

    样例 #1

    样例输入 #1

    4.3
    
    • 1

    样例输出 #1

    3
    
    • 1

    提示

    数据保证, 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码(C)

    
    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

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

    题目描述

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

    输入格式

    一个整数 N N N

    输出格式

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

    样例 #1

    样例输入 #1

    123
    
    • 1

    样例输出 #1

    321
    
    • 1

    样例 #2

    样例输入 #2

    -380
    
    • 1

    样例输出 #2

    -83
    
    • 1

    提示

    【数据范围】

    $-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]))
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码(C)

    #include 
    #include 
    
    /* 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    题目链接: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

    样例输出 #1

    8.00
    
    • 1

    提示

    对于所有数据: 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))
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    代码(C)

    #include 
    #include 
    #include 
    /* 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    十五、【深基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
    • 2

    样例输出 #1

    4
    
    • 1

    提示

    数据保证, 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码(C)

    #include
    #include
    #include
    #include 
     
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    十六、最长连号

    题目链接: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
    • 2

    样例输出 #1

    5
    
    • 1

    提示

    数据规模与约定

    对于 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)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    代码(C)

    #include 
    #include 
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

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

    题目描述

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

    输入格式

    输入一个正整数 n n n

    输出格式

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

    样例 #1

    样例输入 #1

    21
    
    • 1

    样例输出 #1

    7
    
    • 1

    提示

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码(C)

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

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

    题目描述

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

    输入格式

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

    输出格式

    输出矩形和正方形

    样例 #1

    样例输入 #1

    4
    
    • 1

    样例输出 #1

    01020304
    05060708
    09101112
    13141516
    
          01
        0203
      040506
    07080910
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码(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")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    代码(C)

    #include
    #include
    #include
    #include 
     
    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;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    十九、【深基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
    • 2

    样例输出 #1

    7.67
    
    • 1

    提示

    数据保证, 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)))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二十、[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
    1
    
    • 1
    • 2

    样例 #2

    样例输入 #2

    6188
    
    • 1

    样例输出 #2

    14
    1
    
    • 1
    • 2

    样例 #3

    样例输入 #3

    40404
    
    • 1

    样例输出 #3

    99
    4
    
    • 1
    • 2

    代码(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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    代码(C)

    #include
    #include
    #include
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    二十一、[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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    样例输出 #1

    -7
    
    • 1

    样例 #2

    样例输入 #2

    290 
    230 
    280 
    200 
    300 
    170 
    330 
    50 
    90 
    80 
    200 
    60
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    样例输出 #2

    1580
    
    • 1

    代码(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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代码(C)

    
    #include 
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    【实用工具】frp实现内网穿透
    纺织企业如何选好网关实现数据采集和远程监控?
    linux配置jdk
    神经系统ct与mri影像解读,神经系统影像学检查
    【Github】sync fork后,意外关闭之前提交分支的pr申请 + 找回被关闭的pr请求分支中的文件
    C语言题目练习
    朴素贝叶斯算法
    实验3.2 Numpy应用
    微信小程序开发:页面分享卡片、风格选择、通道启用等可配置
    沃尔玛Walmart EDI 850订单详解
  • 原文地址:https://blog.csdn.net/weixin_62529383/article/details/133237280