羅谷クイズ: 循環構造

今日のタスクは 1 日 5 問で、4 日間の結果であり、Python と C で書く予定です。
質問元: https://www.luogu.com.cn/training/102#problems


1. 【深基底4. 例2】最小値を求める

質問リンク: https://www.luogu.com.cn/problem/P5718

質問の説明

nnを与えるとん_n整数ai a_iある私は、これお願いしますn個の整数の中で最も小さい値は何ですか?

入力フォーマット

最初の行には正の整数nnが入力されますnは数値の数を表します。

2行目に「nn」と入力しますn負でない整数。a 1 、 a 2 … a_1,a_2 \dots a_nある1ある2ある、スペースで区切ります。

出力フォーマット

このnnを表す負でない整数を出力します。n 個の非負の整数の中で最小の値

例1

サンプル入力 #1

8
1 9 2 6 0 8 1 7

サンプル出力 #1

0

ヒント

データ保証、n ≤ 100 n\le100n100one0 ≤ ai ≤ 1000 0\およびa_i \and0ある私は1000

コード(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;	
} 

2. [深層ベース4. 例3] 分類平均

質問リンク: https://www.luogu.com.cn/problem/P5719

質問の説明

与えられたnnnkkは 1 からnnn間のすべての正の整数はkk は割り切れます (つまり、kkkの倍数)、クラス B の数値はできません。これら 2 種類の数値の平均を、1 1スペースで区切られた1桁の数字。

データは、両方のタイプの数値の数が0 0にならないことを保証します。0

入力フォーマット

2 つの正の整数nnを入力しますnkk

出力フォーマット

それぞれクラス A とクラス B の平均数を表す 2 つの実数を 1 行で出力します。小数点第 1 位まで正確です。

例1

サンプル入力 #1

100 16

サンプル出力 #1

56.0 50.1

ヒント

データ保証、1 ≤ n ≤ 10000 1 \leq n\leq 100001n100001 ≤ k ≤ 100 1 \leq k \leq 1001k100

コード(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;	
} 

3.【深い基礎4.例4】ワンフットチャイ

質問リンク: https://www.luogu.com.cn/problem/P5720

質問の説明

『荘子』は「毎日一尺の棒の半分を摂取すれば、永遠に無尽蔵になるだろう」と言いました。初日はaaの長さがあります翌日から毎日スティックの半分を切り落とす必要があります(毎回2 22、切り捨て)。これから数日で棒の長さは1 11

入力フォーマット

正の整数aaを入力してくださいaはスティックの長さを表します。

出力フォーマット

棒の長さが 1 になる日数を示す正の整数を出力します11

例1

サンプル入力 #1

100

サンプル出力 #1

7

ヒント

データ保証、1 ≤ a ≤ 1 0 9 1 \le a\le 10^91ある1 09

コード(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. [深底4. 例6] デジタル直角三角形

質問リンク: https://www.luogu.com.cn/problem/P5721

質問の説明

nnを与えるn 、辺の長さがnn である直角を出力してくださいn番目の直角三角形。すべての数字は2 22 2がない場合は2桁で構成されます2桁の場合は先頭に0 00

入力フォーマット

正の整数nnを入力してください

出力フォーマット

質問の要求に応じて数値の直角三角形を出力します。

例1

サンプル入力 #1

5

サンプル出力 #1

0102030405
06070809
101112
1314
15

ヒント

データ保証、1 ≤ n ≤ 13 1\le n\le131n13

コード(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;	
} 

5. [NOIP1998普及グループ] 階乗の和

質問リンク: https://www.luogu.com.cn/problem/P1009

質問の説明

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

ここで、 は階乗を表し、 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times として定義されます!1=n×( n1 )×( n2 )××1 . たとえば、5 ! = 5 × 4 × 3 × 2 × 1 = 120 5! = 5 \times 4 \times 3 \times 2 \times 1=1205 =5×4×3×2×1=120

入力フォーマット

正の整数nn

出力フォーマット

正の整数SSSは計算結果を表します。

例1

サンプル入力 #1

3

サンプル出力 #1

9

ヒント

【データ範囲】

100 %の場合100 \%データの100% 、 1 ≤ n ≤ 50 1 \le n \le 501n50

【その他注意事項】

注: この質問は「詳細な基礎」で例として使用されていますが、データ範囲はn ≤ 20 n \le 20のみです。n20、この質問は、本のコードを使用して合格することはできません。

この問題に合格したい場合は、引き続き第 8 章の精度の高い知識を学習してください。

コード(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;
}

6. 【NOIP2013普及部会】課題集計

質問リンク: https://www.luogu.com.cn/problem/P1980

質問の説明

1 1の区間で計算してみます1からnnまでnのすべての整数のうちxxx0 ≤ x ≤ 9 0\le x\le90バツ9 ) それは全部で何回登場しますか? たとえば、1 1111 1111では、つまり1、2、3、4、5、6、7、8、9、10、11 1、2、3、4、5、6、7、8、9、10、111 2 3 4 5 6 7 8 9 10 11では、数字1 11出現4 44回。

入力フォーマット

2 22 つの整数n、xn、xn x、スペースで区切ります。

出力フォーマット

1 1xxを表す1 つの整数x が出現する回数。

例1

サンプル入力 #1

11 1

サンプル出力 #1

4

ヒント

100 %の場合100\%データの100% 、 1 ≤ n ≤ 1 0 6 1\le n\le 10^61n1 060 ≤ x ≤ 9 0\le x \le 90バツ9

コード(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;
}


7. 【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}S=1+21+31++n1明らかに、任意の整数kkに対してknnnが十分に大きい場合、S n > k S_n>kS>k

ここで整数kk が与えられますk、最小nnn 、 S n > k S_n>kとなるS>k

入力フォーマット

正の整数kkk

出力フォーマット

正の整数nn

例1

サンプル入力 #1

1

サンプル出力 #1

2

ヒント

【データ範囲】

100 %の場合100\%データの100% 、 1 ≤ k ≤ 15 1\le k \le 151k15

【質問元】

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++;
    }

8. 【NOIP2015普及団体】金貨

質問リンク: https://www.luogu.com.cn/problem/P2669

質問の背景

NOIP2015普及グループT1

質問の説明

王は忠実な騎士に賃金として金貨を支払いました。初日、騎士は金貨 1 枚を受け取り、次の 2 日間 (2 日目と 3 日目) は毎日金貨 2 枚を受け取り、次の 3 日間 (4 日目、5 日目、6 日目) は毎日金貨 2 枚を受け取りました。毎日 3 枚の金貨を受け取りました。;次の 4 日間 (7 日目、8 日、9 日、10 日目)、毎日 4 枚の金貨を受け取ります...; この賃金支払いモデルは次のように継続します: nn が連続したときn日間毎日nnを受け取りましたn金貨の後n + 1 n+1n+1日では、n + 1 n + 1n+金貨1枚。

kkの前に数えてくださいk日間で、騎士は合計何枚の金貨を獲得しましたか?

入力フォーマット

正の整数kkkは、金貨を発行する日数を表します。

出力フォーマット

正の整数、騎士が受け取った金貨の数。

例1

サンプル入力 #1

6

サンプル出力 #1

14

例2

サンプル入力 #2

1000

サンプル出力 #2

29820

ヒント

【サンプル1の説明】

騎士は初日に金貨 1 枚、2 日目と 3 日目に金貨 2 枚、4 日目、5 日目、6 日目に金貨 3 枚を受け取ります。したがって、合計1 + 2 + 2 + 3 + 3 + 3 = 14 が受信されます 1+2+2+3+3+3=141+2+2+3+3+3=金貨14枚。

100 %の場合100\%データの100% 、 1 ≤ k ≤ 1 0 4 1\le k\le 10^41k1 04

コード(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;
}

9. [深基底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の値(正の整数nn )nは100以下です。あなたはガウスほど賢くないので、等差数列の和の公式を使って直接答えを見つけることはできません。

入力フォーマット

正の整数nnを入力してください

出力フォーマット

最終的な合計答えを表す正の整数を出力します。

例1

サンプル入力 #1

100

サンプル出力 #1

5050

ヒント

データ保証、1 ≤ n ≤ 100 1 \leq n \leq 1001n100

コード(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;	
} 

10. [深基底4. 例13] 素数ポケット

質問リンク: https://www.luogu.com.cn/problem/P5723

質問の説明

小さなAには素数ポケットがあり、さまざまな素数を入れることができます。彼は2 2から行きました2から順番に各自然数が素数かどうかを判定し、素数であればその番号をポケットに入れます。

ポケットの耐荷重はポケット内のすべての数値の合計です。

ただし、ポケットの耐荷重には限界があり、素数の合計がLL を超えることはできません。L._ _ LLを与えるL さん、ポケットに素数は何個入りますか? これらの素数を小さい順に出力し、収容できる素数の最大数を出力します。数値の間は改行で区切ります。

入力フォーマット

1 行につき1 つの正の整数LLL。 _

出力フォーマット

これらの素数を小さい順に出力し、すべての数値の間に空行を入れて、収容できる素数の最大数を出力します。

例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}^51L105

コード(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;
}

11. [USACO1.5] プライム回文

質問リンク: https://www.luogu.com.cn/problem/P1217

質問の説明

だって151 151151 は素数であり、回文でもある (左から右、右から左から見ても同じに見える)、つまり151 151151は回文素数です。

範囲[ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000) を求めるプログラムを作成してください。[ _b ] ( 5ある<b100 000 000 ) (1 億) すべての回文素数。

入力フォーマット

最初の行には 2 つの正の整数aaが入力されます。abbb

出力フォーマット

回文素数のリストを 1 行に 1 つずつ出力します。

例1

サンプル入力 #1

5 500

サンプル出力 #1

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

ヒント

ヒント 1: 回文を生成し、それらが素数であるかどうかを確認します。

ヒント 1: すべての回文を見つけて、それらが素数 (素数) であるかどうかを判断します。

ヒント 2: 数字を適切に組み合わせて回文を生成します。以下のようなループが複数必要になる場合があります。

ヒント 2: 正しい数の回文を生成するには、以下のような複数のループが必要になる場合があります。

タイトルの翻訳はNOCOWから来ています。

USACO トレーニング セクション 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;//结束程序 
}

12.シャオユウは泳いでいる

質問リンク: https://www.luogu.com.cn/problem/P1423

質問の説明

シャオユウは楽しそうに泳いでいましたが、悲しいことにすぐに自分には力が足りず、泳ぐのはとても疲れることに気づきました。Xiaoyuは最初のステップで2 2を泳げることが知られています全長は2メートルでしたが、彼女はますます疲れて体力が低下し、次のステップごとに前のステップの距離の98% 98\%98%今、Xiaoyuが知りたいのは、 SSの距離まで泳ぎたいかどうかです彼女はsメートルの場所を泳ぐのに何歩必要ですか? この問題を解決するプログラムを作成してください。

入力フォーマット

実数ssを入力してくださいs(単位:メートル)は、泳ぐ目標の距離を示します。

出力フォーマット

Xiaoyu が合計で何歩泳ぐ必要があるかを示す整数を出力します。

例1

サンプル入力 #1

4.3

サンプル出力 #1

3

ヒント

データ保証、0 ≤ s < 100 0 \leq s < 1000s<100、およびsssの小数点以下の桁数は最大 1 桁です。

コード(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;
}

13. 【NOIP2011普及グループ】デジタルリバーサル

質問リンク: https://www.luogu.com.cn/problem/P1307

質問の説明

整数NN が与えられた場合N さん、この番号の各桁の数字を逆にして、新しい番号を取得してください。新しい数値は整数の共通形式も満たす必要があります。つまり、指定された元の数値がゼロでない限り、反転後の新しい数値の最上位桁はゼロであってはなりません (例 2 を参照)。

入力フォーマット

整数NN

出力フォーマット

反転後の新しい数値を表す整数。

例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;
}

14. 月が沈みカラスが鳴くとお金が数えられる(フィボナッチ数列)

質問リンク: https://www.luogu.com.cn/problem/P1720

質問の背景

(この質問には隠し曲はありません...推測する必要はありません...)

『愛と悲しみの物語 その1・ハートエイク』の最終章。

ピザを食べた後、ユエルオウディーさんはそれが予算を超えていることに気づきました。愛と悲しみの神様の前で恥をさらさないためには、覚悟を決めてお金を数えるしかなかった…。

質問の説明

お金を計算した後、岳若は泣きながらこう思いました、「騙されたな、(以下福建語で読む)私はお父さんとお母さんに頼るよ、(以下英語で読む)それはイテヨウだ!」だから、愛と悲しみのとき、偉大な神がそれはいくらかと尋ねると、岳洛烏帝は意味不明なことを言いました。愛と悲しみの神は言った「忘れてください、忘れてください、私はただnnに尋ねます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}}F=5 (21+ _5 )n(21 5 )

愛と哀しみの大神がプログラミングを覚えたので1 1を使ってみたF n F_nは1分で見つかりました。F結果として。これには岳洛吼ティアオは衝撃を受けた。愛と悲しみを学べますか? マスターはF n F_nを求めますFその価値はありますか?

入力フォーマット

1 行に1 つの自然数nn

出力フォーマット

1 1だけ実数F n F_nの1行F、小数点以下 2 桁まで。

例1

サンプル入力 #1

6

サンプル出力 #1

8.00

ヒント

すべてのデータの場合: 0 ≤ n ≤ 48 0 \leq n\leq 480n48

コード(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;
}

15. [Deep Foundation 4. 演習 5] 範囲/最大スパン値を求める

質問リンク: https://www.luogu.com.cn/problem/P5724

質問の説明

nnを与えるとん_n整数ai a_iある私は、これお願いしますn個の整数の範囲はどこまでですか範囲とは、一連の数値の最大値から最小値を引いた値の差を意味します。

入力フォーマット

最初の行には正の整数nnが入力されますnは整数の数を表します。

2行目に「nn」と入力しますn 个整数 a 1 , a 2 … a n a_1,a_2 \dots a_n ある1ある2ある、スペースで区切ります。

出力フォーマット

このnnを表す整数を出力しますn個の整数の範囲。

例1

サンプル入力 #1

6
4 1 5 1 4 1

サンプル出力 #1

4

ヒント

データ保証、1 ≤ n ≤ 100 1 \leq n\leq 1001n1000 ≤ ai ≤ 1000 0\le a_i \le 10000ある私は1000

コード(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;	
} 

16. 最も長い連続番号

質問リンク: https://www.luogu.com.cn/problem/P1420

質問の説明

入力長はnnですnの正の整数のシーケンス。出力シーケンス内の最も長い連続数値の長さが必要です。

シリアル番号とは、小さいものから大きいものまで連続する自然数を指します。

入力フォーマット

最初の行、整数nn

2行目、nnn整数ai a_iある私は、スペースで区切ります。

出力フォーマット

数字、最も長く連続する数字の数。

例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^41n1 041 ≤ ai ≤ 1 0 9 1 \leq a_i \leq 10^91ある私は1 09

コード(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;
}

17. 【NOIP2012普及部】素因数分解

質問リンク: https://www.luogu.com.cn/problem/P1075

質問の説明

既知の正の整数nnnは 2 つの異なる素数の積です。2 つの素数のうち大きい方を見つけてください。

入力フォーマット

正の整数nnを入力してください

出力フォーマット

正の整数ppを出力しますp、これは大きい方の素数です。

例1

サンプル入力 #1

21

サンプル出力 #1

7

ヒント

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

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;
}

18. [深い基礎 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;	
} 

19. [徹底した基礎 4. 実践 9] 採点

質問の説明

ここで、 n ( n ≤ 1000 ) n(n \le 1000)があります。n ( n1,000 人の審査員が出場者に0から0までのスコアを付けます。010 1010最高スコアと最低スコアを削除する必要があり (最高スコアまたは最低スコアが複数ある場合は、1 つだけ削除する必要があります)、残りの評価の平均がプレーヤーのスコアとなります。次に、審査員の数とその得点を入力します。出場者の最終得点を2 22 位小数。

入力フォーマット

最初の行には正の整数nnが入力されますn はnnがあることを示しますn裁判官。

2行目に「nn」と入力しますn正の整数、iii正の整数はii 番目i審査員によって与えられたスコア

出力フォーマット

プレイヤーの最終スコアを示す、小数点 2 桁を 1 行に出力します。

例1

サンプル入力 #1

5
9 5 6 8 9

サンプル出力 #1

7.67

ヒント

データ保証、3 ≤ n ≤ 1000 3 \leq n \leq 10003n1000、各審査員の得点は0 0010 10100 0010 1010 ) 間の整数。

コード(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)))

20. [COCI2017-2018#6] ダヴォル

質問リンク: https://www.luogu.com.cn/problem/P4956

タイトル翻訳

南極を征服した後、ダヴォルは新たな挑戦に乗り出しました。次のステップは、シベリア、グリーンランド、ノルウェーでの北極圏遠征です。彼は2018年に来ます20182018 年12 月12 日12月31日31日31 日から開始します。それまでに合計nnを集める必要がありますnドル。彼は毎週月曜日にxx$ xx+k x+kバツ+k元、...、x+6,000 x+6,000バツ+6,000、 52 52調達52週間。ここで、x、kx、k× kは正の整数で、1 ≤ x ≤ 100 1 \le x \le 1001バツ100

x、kx、kの計算を手伝ってください× kの場合、 nnはどれくらいn元。

回答が複数ある場合はxxを出力xはできるだけ大きいです、kkkはできるだけ小さいものです。注意してください_k は0 0より大きくなければなりません0

質問の説明

南極点制覇に成功した後、ダヴォルは新たな挑戦に向けて準備を進めている。次はシベリア、グリーンランド、ノルウェーへの北極探検です。彼は 2018 年 12 月 31 日に旅行を開始し、それまでに N クーナ (クロアチアの通貨) を集める必要があります。これを行うために、彼は毎週月曜日に X (X ≤ 100) クーナを旅行資金に積み立て、毎週火曜日に X + K クーナ、毎週水曜日に X + 2* K というように積み立てることにしました。日曜日、彼は X + 6* K クーナを片付けます。このようにして、2018年1月1日(月曜日)から2018年12月30日(日曜日)までの52週間にわたって資金を集める予定です。

金額 N がわかっている場合は、値 X と K を出力して指定された期間内に正確な金額を収集できるようにします。解は常に存在し、複数ある場合は、最大の X と最小の K を持つものを出力します。

入力フォーマット

入力の最初の行には、タスクからの数値である整数 N (1456 ≤ N ≤ 145600) が含まれています。

出力フォーマット


出力の最初の行には X (0 < X ≤ 100) の値が含まれ、2 番目の出力には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;
}

21. [NOIP2004 改善グループ] ジンジンの貯蓄計画

質問リンク: https://www.luogu.com.cn/problem/P1089

質問の説明

ジンジンはいつも自分のお小遣いを管理してきました。毎月初めに、母はジンジンを300 300与えます。ジンジンさんは300元があれば今月の出費の予算を立て、実際の出費を常に予算と一致させることができます。

ジンジンに貯金の仕方を学ばせるために、母親はいつでもジンジンに100円全額を預けて、年末には20%を追加することを提案しました。20%はジンジンに還元されます。そこで、ジンジンさんは貯蓄計画を立てました。毎月初めに母親からお小遣いをもらった後、月末までに100 100100元、または正確に100 100100元の場合、彼女は100元全額を母親に預け、残りのお金は自分の手元に保管する予定です。

たとえば、11 1111月初旬、ジンジンの手札にはまだ83 8383元、母はジンジンに300 300300元。ジンジンは11 11になる予定です11月の出費は180 180です180元なら母親と一緒に200200円200元、183 183 は183元。11 11です11 月末、ジンジン3 33元。

ジンジンさんは、この貯蓄計画の主なリスクは、母親に預けたお金を年末までに引き出せないことだと気づきました。ある月の初めに、ジンジンが持っているお金と母親から今月渡されたお金では、今月の当初の予算を満たせない可能性があります。そうなると、ジンジンは今月お金を節約して予算を圧縮しなければなりません。

ここでは2004 2004を基準にしてください2004 111月から12月12日12 月の月次手当予算を使用して、この状況が発生するかどうかを判断しますそうでない場合は、2004 20042004年末、母はジンジンが普段貯めていたお金に20%20%がジンジンに戻った後、ジンジンはどれだけのお金を手にすることになるでしょうか。

入力フォーマット

12 1212行のデータ。各行には350 350未満の値が含まれます。350は負ではない整数で、1 11月から12月12日12月のジンジンの予算。

出力フォーマット

整数。貯蓄計画の実行中に特定の月に十分なお金がない場合、出力- X -XXXXX は、これが発生した最初の月を示します。それ以外の場合は、2004 年2004年末、ジンジンはいくらのお金を手にしているでしょうか?

Luogu はファイル入出力を実行する必要はなく、標準入出力を実行する必要があることに注意してください。

例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