質問編集履歴
4
題名の微変更、誤字の修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
競技プログラ
|
1
|
+
競技プログラミングの問題を教えていただきたいです(正整数の立方数による表現)
|
body
CHANGED
@@ -82,5 +82,5 @@
|
|
82
82
|
53 を3個以下の立方数の和として表現することはできない.
|
83
83
|
|
84
84
|
自分で作成したソースコードを載せさせていただきました。
|
85
|
-
上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。(具体的にはn=4059, m=10この場合の正しい答えは12
|
85
|
+
上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。(具体的にはn=4059, m=10この場合の正しい答えは12^3+11^3+10^3で3、自分のコードでは5と出てしまいます。)
|
86
86
|
理由はわかっているのですが、改善方法がわかりません。
|
3
ソースコードのミスコードを削りました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -13,7 +13,6 @@
|
|
13
13
|
k = 1;
|
14
14
|
}else{
|
15
15
|
for(i = 1 ; i < n ; i++){
|
16
|
-
printf("%d*%d*%d=%d\n", i, i, i, i*i*i);
|
17
16
|
if(i*i*i > n){
|
18
17
|
k = i-1;
|
19
18
|
break;
|
2
ソースコードを書き直しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -6,19 +6,30 @@
|
|
6
6
|
int sum = 0, min = 11;
|
7
7
|
|
8
8
|
int main(void){
|
9
|
-
int n, m;
|
9
|
+
int n, m, kans = 0;
|
10
10
|
scanf("%d%d", &n, &m);
|
11
|
-
int i, k, ans;
|
11
|
+
int i, k, ans = 100;
|
12
|
+
if(n == 1){
|
13
|
+
k = 1;
|
14
|
+
}else{
|
12
|
-
|
15
|
+
for(i = 1 ; i < n ; i++){
|
16
|
+
printf("%d*%d*%d=%d\n", i, i, i, i*i*i);
|
13
|
-
|
17
|
+
if(i*i*i > n){
|
14
|
-
|
18
|
+
k = i-1;
|
15
|
-
|
19
|
+
break;
|
20
|
+
}
|
16
21
|
}
|
17
22
|
}
|
23
|
+
for(;k > 1;k--){
|
18
|
-
|
24
|
+
kans = keisan(n, k);
|
25
|
+
if(kans < ans){
|
26
|
+
ans = kans;
|
27
|
+
}
|
28
|
+
sum = 0;
|
29
|
+
}
|
19
30
|
if(ans <= m){
|
20
31
|
printf("%d\n", ans);
|
21
|
-
|
32
|
+
}else{
|
22
33
|
printf("-1\n");
|
23
34
|
}
|
24
35
|
}
|
@@ -31,6 +42,7 @@
|
|
31
42
|
return n / (p*p*p);
|
32
43
|
}
|
33
44
|
int keisan(int n, int k){
|
45
|
+
int q = 0;
|
34
46
|
if(k != 1){
|
35
47
|
sum += kosuu(n, k);
|
36
48
|
keisan(amari(n, k), k-1);
|
@@ -40,6 +52,7 @@
|
|
40
52
|
return sum;
|
41
53
|
}
|
42
54
|
|
55
|
+
|
43
56
|
```競技プログラムの問題を教えていただきたいです。(C言語でお願いいたします)
|
44
57
|
【問題原文】
|
45
58
|
正整数 n と m が与えらえるとき,n を m 個以下の立方数(正整数の三乗)の和で表現することを考える.
|
@@ -70,4 +83,5 @@
|
|
70
83
|
53 を3個以下の立方数の和として表現することはできない.
|
71
84
|
|
72
85
|
自分で作成したソースコードを載せさせていただきました。
|
73
|
-
上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。
|
86
|
+
上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。(具体的にはn=4059, m=10この場合の正しい答えは12**3+11**3+10**3で3、自分のコードでは5と出てしまいます。)
|
87
|
+
理由はわかっているのですが、改善方法がわかりません。
|
1
ソースコードを載せさせていただきました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,4 +1,46 @@
|
|
1
|
+
```C言語
|
2
|
+
#include<stdio.h>
|
3
|
+
int amari(int , int);
|
4
|
+
int kosuu(int, int);
|
5
|
+
int keisan(int, int);
|
6
|
+
int sum = 0, min = 11;
|
7
|
+
|
8
|
+
int main(void){
|
9
|
+
int n, m;
|
10
|
+
scanf("%d%d", &n, &m);
|
11
|
+
int i, k, ans;
|
12
|
+
for(i = 1 ; i < n ; i++){
|
13
|
+
if(i*i*i > n){
|
14
|
+
k = i-1;
|
15
|
+
break;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
ans = keisan(n, k);
|
19
|
+
if(ans <= m){
|
20
|
+
printf("%d\n", ans);
|
21
|
+
}else{
|
22
|
+
printf("-1\n");
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
int amari(int n, int p){
|
27
|
+
return n % (p*p*p);
|
28
|
+
}
|
29
|
+
|
30
|
+
int kosuu(int n, int p){
|
31
|
+
return n / (p*p*p);
|
32
|
+
}
|
33
|
+
int keisan(int n, int k){
|
34
|
+
if(k != 1){
|
35
|
+
sum += kosuu(n, k);
|
36
|
+
keisan(amari(n, k), k-1);
|
37
|
+
}else{
|
38
|
+
sum += n;
|
39
|
+
}
|
40
|
+
return sum;
|
41
|
+
}
|
42
|
+
|
1
|
-
競技プログラムの問題を教えていただきたいです。(C言語でお願いいたします)
|
43
|
+
```競技プログラムの問題を教えていただきたいです。(C言語でお願いいたします)
|
2
44
|
【問題原文】
|
3
45
|
正整数 n と m が与えらえるとき,n を m 個以下の立方数(正整数の三乗)の和で表現することを考える.
|
4
46
|
例えば,n = 35,m = 10 のとき,n は次のように立方数を使って表現できる
|
@@ -25,4 +67,7 @@
|
|
25
67
|
53 3
|
26
68
|
出力2:
|
27
69
|
-1
|
28
|
-
53 を3個以下の立方数の和として表現することはできない.
|
70
|
+
53 を3個以下の立方数の和として表現することはできない.
|
71
|
+
|
72
|
+
自分で作成したソースコードを載せさせていただきました。
|
73
|
+
上記のコードでは例の入力1, 2には対応できているのですが、自分でほかの値で試したときに正しい値を出力しませんでした。一応提出もしてみたのですが、WRONG-ANSWERではなくRUN-ERROER判定となってしまいました。
|