今日のタスクは 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\le100n≤100one0 ≤ 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
質問の説明
与えられたnnnとkkは 1 からnnn間のすべての正の整数はkk は割り切れます (つまり、kkkの倍数)、クラス B の数値はできません。これら 2 種類の数値の平均を、1 1スペースで区切られた1桁の数字。
データは、両方のタイプの数値の数が0 0にならないことを保証します。0。
入力フォーマット
2 つの正の整数nnを入力しますnとkk。
出力フォーマット
それぞれクラス A とクラス B の平均数を表す 2 つの実数を 1 行で出力します。小数点第 1 位まで正確です。
例1
サンプル入力 #1
100 16
サンプル出力 #1
56.0 50.1
ヒント
データ保証、1 ≤ n ≤ 10000 1 \leq n\leq 100001≤n≤10000,1 ≤ k ≤ 100 1 \leq k \leq 1001≤k≤100。
コード(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\le131≤n≤13。
コード(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 50n≤50)。
ここで、 は階乗を表し、 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times として定義されます!
。1ん!=n×( n−1 )×( n−2 )×⋯×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 501≤n≤50。
【その他注意事項】
注: この質問は「詳細な基礎」で例として使用されていますが、データ範囲はn ≤ 20 n \le 20のみです。n≤20、この質問は、本のコードを使用して合格することはできません。
この問題に合格したい場合は、引き続き第 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のすべての整数のうちxxx(0 ≤ x ≤ 9 0\le x\le90≤バツ≤9 ) それは全部で何回登場しますか? たとえば、1 11~11 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^61≤n≤1 06,0 ≤ 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に対してk、nnnが十分に大きい場合、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 151≤k≤15。
【質問元】
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^41≤k≤1 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+⋯+( n−1 )+nの値(正の整数nn )nは100以下です。あなたはガウスほど賢くないので、等差数列の和の公式を使って直接答えを見つけることはできません。
入力フォーマット
正の整数nnを入力してくださいん。
出力フォーマット
最終的な合計答えを表す正の整数を出力します。
例1
サンプル入力 #1
100
サンプル出力 #1
5050
ヒント
データ保証、1 ≤ n ≤ 100 1 \leq n \leq 1001≤n≤100。
コード(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}^51≤L≤105。
コード(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≤ある<b≤100 、000 、000 ) (1 億) すべての回文素数。
入力フォーマット
最初の行には 2 つの正の整数aaが入力されます。aとbbb。
出力フォーマット
回文素数のリストを 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 < 1000≤s<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 480≤n≤48。
コード(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 1001≤n≤100,0 ≤ 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^41≤n≤1 04,1 ≤ 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^91≤n≤2×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 ( n≤1,000 人の審査員が出場者に0から0までのスコアを付けます。0~10 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 10003≤n≤1000、各審査員の得点は0 00~10 1010(0 00と10 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$ x、x+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 -X− X、XXX は、これが発生した最初の月を示します。それ以外の場合は、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;
}