プログラミングのお題スレ Part3

このエントリーをはてなブックマークに追加
822809:2014/05/31(土) 02:27:23.08 ID:RzySFflE
ところで、>>794召喚して、>>809があってるかそろそろ聞きたいんだが。
823デフォルトの名無しさん:2014/05/31(土) 05:11:19.49 ID:74UzWmZV
四則演算になってないような
824デフォルトの名無しさん:2014/05/31(土) 06:28:06.16 ID:S66lgqUj
825デフォルトの名無しさん:2014/05/31(土) 20:17:31.24 ID:RzySFflE
>>823
四則演算+剰余しか使ってないのにぃ〜。
1ビット算出して大きくしてるだけじゃないですかー。Orz
関数も使っちゃダメなの?そんな話ないよ。
たとえ関数がだめでも展開するだけになっちゃうよ?マクロ組むとか。

具体的にどう四則演算になってないか教えてください。
お願いします。
826デフォルトの名無しさん:2014/06/01(日) 10:03:30.64 ID:JwNR3eSO
>>823
ビット演算になっていにょいようにょ
827デフォルトの名無しさん:2014/06/01(日) 10:50:18.35 ID:QQAPK+BU
templatだけでも実装できそうだな
828デフォルトの名無しさん:2014/06/01(日) 21:15:24.10 ID:073ZpLpT
>>827
再起禁止なんですよね。
テンプレートの扱いについては未定義ですが・・・。
829809:2014/06/02(月) 00:03:02.55 ID:Zd9YSbvW
うぅ。断片的にああでもないこうでもないと言われても!

わけがわからないよ。

うぅわああああん。(ToT
830 ◆0qAv26otVI :2014/06/03(火) 01:29:23.25 ID:x50KDxpk
831デフォルトの名無しさん:2014/06/03(火) 02:23:16.40 ID:R8wsXVj9
>>830
がんばってるねー。
これだけ真面目に改造してくれると書いた方も誉れだよ。
がんばって!

そうそう、ループ回数が4*4*4のようだけど、あってる?
自分でやれってこと?
832デフォルトの名無しさん:2014/06/03(火) 02:30:34.43 ID:R8wsXVj9
>>830
そうそう、投稿するときは一言ほしいなー。
このテストパターンは全部真になることを想定して書いてあるの?
833デフォルトの名無しさん:2014/06/04(水) 05:30:43.92 ID:QbUS6u7k
   |=番兵|_
  ( ・ω・) <ステンバーイ
  ○={=}〇,
   |:::::::::\, ', ´
、、、、し 、、、(((.@)
834デフォルトの名無しさん:2014/06/04(水) 09:59:31.38 ID:q8b8aypY
>>832 VSExpress2010 用に
C++11 から C++ に直してくれ。アップアップ溺れそう
835デフォルトの名無しさん:2014/06/04(水) 23:41:52.12 ID:1iROfyZz
お題:n個の任意の自然数の和がxのとき、n個の自然数の積の最大値を求める。

x=10 -> 36
x=64 -> 13947137604
x=100 -> 7412080755407364
836デフォルトの名無しさん:2014/06/05(木) 01:08:46.94 ID:MiWap7Hz
1/2の自乗は1/4
1/3の三乗は1/27だから
中央値に近い自乗が最大?
837デフォルトの名無しさん:2014/06/05(木) 01:12:17.98 ID:t1UhlRAe
838デフォルトの名無しさん:2014/06/05(木) 01:20:29.41 ID:MiWap7Hz
36って2*3*2*3か
839デフォルトの名無しさん:2014/06/05(木) 02:36:57.82 ID:g1rky1u8
>>835 Python
from __future__ import print_function
def f835(x):
  a, b = x % 3, int(x / 3)
  if a <= 1 and b >= 1:
    a += 3
    b -= 1
  s = "{}*3**{}".format(a, b)
  m = eval(s)
  print("x={0} -> {3}={1}".format(x,m,a,s))

for i in range(10): f835(i)
f835(10)
f835(64)
f835(100)
840デフォルトの名無しさん:2014/06/05(木) 06:15:27.83 ID:/utsiCTM
>>834
特に特殊なことやってないと思うんだけど。
for文がForeachなだけで。俺もvc2013eeで書いてるし。
C++03は忘れました。テヘッ!
841ゴアー神風 ◆mW2uevDxfA :2014/06/05(木) 07:26:17.09 ID:tu5JPzwB
>>835
ttp://ideone.com/i8yatB
ほぼC。間違ってること確定だが、問題が不明瞭で正確性がない。
言い訳はソースに書いておいた。
テストとは一致してないので、多分俺のだめだね。
結果が与えられてるんだったら、素数で割ってけばNを求められるんだがね〜。
結果書いてあるけど、それは計算前に取得できるのか、計算後に取得できるのか不明瞭だ。

とりあえず書いたので、>>837を参照しようと思う。
842デフォルトの名無しさん:2014/06/05(木) 07:27:28.84 ID:tu5JPzwB
げ、間違えた。ハンドルなんていらない・・・。Orz
PCゲーのHeathstoneをよろしく!
843デフォルトの名無しさん:2014/06/05(木) 07:40:09.12 ID:tu5JPzwB
なるほど、こうやって解くのね。
上限値を超えない保障をどうやってやってるのかよくわからん・・・。Orz
844デフォルトの名無しさん:2014/06/05(木) 08:49:21.85 ID:tu5JPzwB
ttp://ideone.com/l6EyKA
うーん。お手軽実装だと、ここら辺が限界。
一応、偏ってるが思いつく総当たりはしてるが、思った結果にならんね。
うーん。よくわからん。
845デフォルトの名無しさん:2014/06/05(木) 09:18:40.08 ID:nSDQrrzJ
846デフォルトの名無しさん:2014/06/05(木) 09:25:06.90 ID:tu5JPzwB
お前ら頭いいなー。メッキがはがれてきたよ。シクシク。
847デフォルトの名無しさん:2014/06/05(木) 11:01:34.79 ID:2vI6486P
>>846
大丈夫、はなから諦めてる俺がいる
848デフォルトの名無しさん:2014/06/05(木) 11:42:34.78 ID:tu5JPzwB
>>847
とりあえず、間違ってもいいから答えを出すのがモットーだが、
あきらめた時の敗北感だけはどうしても許せん。ので書くんだが、この格差ですよ。
世の中広い!Orz
849デフォルトの名無しさん:2014/06/05(木) 12:36:51.82 ID:fFqYdufV
>>835 Io
f := method(x,(3**((x/3)floor-1)*(2+2**(x%3)))floor)

Io> f(10)
==> 36
Io> f(64)asString(0,0)
==> 13947137604
Io> f(100)asString(0,0)
==> 7412080755407364
850デフォルトの名無しさん:2014/06/05(木) 15:15:41.63 ID:X0QJHSOX
>>848
Schme

手順1
自然数xは3をm回加えて、2をn回加えた数となるような
m,nを求める

手順2
3をm回かけた数に2をn回かけた数をかける
(求める最大値= 3^m * 2^n )

ttp://codepad.org/20fkwUl9
851デフォルトの名無しさん:2014/06/05(木) 15:19:17.67 ID:X0QJHSOX
>>850のアンカーまちがえた
正しくは
>>835 への解答
852デフォルトの名無しさん:2014/06/05(木) 18:22:28.75 ID:O76MB/nL
853デフォルトの名無しさん:2014/06/05(木) 18:48:16.27 ID:O76MB/nL
つーか漸化式直接書き下せるのか、なんで 3 で割ったら最大値になるんだ?
854デフォルトの名無しさん:2014/06/05(木) 20:04:01.52 ID:O76MB/nL
>>853
自己解決。

簡単のため N を k "等"分した場合の最大値を求めることにする。
この時 Σ(i ~ k) (N/k) = N/k Σ(i ~ k) = (N / k) * k = N と表せることから

Π(i ~ k) (N/k) = (N/k) ^ k ... (1)

を最大にするような k を選べばよい。
(1)の対数を取って f(k) として、対数の最大値を求めることにする。

f(k) = log((N/k)^k) = k * log(N/k)

k を微分して極値を求めると

f'(k) = log(N) - log(k) - 1

より f'(k) = 0 の時 k = (N/e) となる。
つまり (N/e) 等分した場合最大値を取る。 e = 2.718 で、この値は今回の場合実数ではなくて、自然数でなければならない。
ここで、以下の点に着目することにより

f(N/2) = N * log(2)/2 = N * 0.34657
f(N/3) = N * log(3)/3 = N * 0.36620

から f(N/2) < f(N/3) となるので、N = 3 で分割させるのがよい。
(もし余りが存在する場合は、余りを 2 の倍数にするようにする)

よって >>850 のようなアルゴリズムになる。
855デフォルトの名無しさん:2014/06/05(木) 20:07:01.78 ID:2vI6486P
>>835
Scheme >>850のデバッグ版


;;; 手順1
;;; 自然数xは3をm回加えて2をn回加えた数
;;; であるようなm,nを求める。mは可能な最大値を
;;; 求める
;;; (例)
;;; 14 -> (+ 3 3 3 3 2) m=4,n=1 Ok
;;; 14 -> (+ 3 3 2 2 2 2) m=2,n=4 No
;;;
;;; 手順2
;;; 3をm回かけた数に2をn回かけた数をかける
;;; 求める最大値-> 3^m * 2^n

ttp://codepad.org/WVzTwBh6
856841:2014/06/05(木) 23:25:09.50 ID:tu5JPzwB
>>854
なるほど、わからん。
けど、3^m*2^nにすればいいことが分かったのでこれなら解けるわ。
数学できる人ってすごいなー。
857841:2014/06/06(金) 00:04:08.90 ID:tu5JPzwB
ttp://ideone.com/n9bWEl
>>855メソッドをパクッてそれっぽい値を出してみた。
確かに出るなー。うーん。俺ってほんと馬鹿。
858デフォルトの名無しさん:2014/06/06(金) 00:16:27.56 ID:K7YTK/42
>>835って一般解じゃなく10と64と100のケースだけ考えろってことなの?
859デフォルトの名無しさん:2014/06/06(金) 00:20:59.52 ID:gpt2nU9A
>>835召喚しないとなー。
最近出題者の失踪が相次いでて出てきてくれないんだよね。
860デフォルトの名無しさん:2014/06/06(金) 00:39:43.36 ID:tIw3lkPh
>>858
全ケースの一般解じゃない?
ちなみに 8 バイトの long long でも 1000 までは計算できない
問題としてはシンプルで面白いと思うけど
861デフォルトの名無しさん:2014/06/06(金) 00:48:59.44 ID:K7YTK/42
そかありがと
862デフォルトの名無しさん:2014/06/06(金) 00:53:56.18 ID:K7YTK/42
2+2+2=6 -> 2*2*2=8

3+3=6 -> 3*3=9

このパターンのみが和と積の大小関係が逆転するケースって感じなのかな?
863デフォルトの名無しさん:2014/06/06(金) 01:07:41.46 ID:K7YTK/42
つまり6の倍数で場合わけ?
http://ideone.com/ZFLn23
864デフォルトの名無しさん:2014/06/06(金) 01:27:53.53 ID:oWmY0rhm
#include <stdio.h>

long long int pow3(int a){
if(a == 0) return 1;
return 3 * pow3(a-1);
}
void f(int n){
int a2, a3;
long long int m;

a3 = n/3;
a2 = n%3;
if(a2 == 0) a2 = 1;
else if(a2 == 1) {a3--; a2 = 4;}
m = pow3(a3) * a2;
printf("%lld\n", m);
}
int main(){
int i;
for(i = 2; i < 120; i++){
printf("%d\t", i);
f(i);
}
return 0;
}
865デフォルトの名無しさん:2014/06/06(金) 02:50:28.11 ID:gpt2nU9A
>>862
へぇ、同じコストで逆転することがあるのか。
例外ってこういうことを言うのかねぇ〜。
べんきょうになるわ。
866デフォルトの名無しさん:2014/06/06(金) 03:55:37.93 ID:GstR2kK+
>>862
これは2をはじめに考えてしまっている
なるべく積がおおきくなるようにしたいのだから
3をはじめに考えなければならない

そうすれば6で場合分けする必要はない
867デフォルトの名無しさん:2014/06/06(金) 03:59:18.71 ID:GstR2kK+
Scheme
>>855 のデバッグ版(+ m,n表示付き)
ttp://codepad.org/UKKAW4Cy
868デフォルトの名無しさん:2014/06/06(金) 04:39:58.94 ID:LPhXdKGT
function f835(x) {
 return pow(3*3, (int)(x/6)) * (x%6 ? (x%6==5? 2*3 : x%6) : 1);
}
869デフォルトの名無しさん:2014/06/06(金) 05:40:59.09 ID:47r183By
>>864
f(1)がキケン
870デフォルトの名無しさん:2014/06/06(金) 05:52:02.29 ID:47r183By
>>869
数が1個では和も積も計算できませんね。失礼しました。前言、忘れてください。
871デフォルトの名無しさん
function f835(x) {
 return pow(3, (int)((x-4*((x%3)%2))/3)) * (4*((x%3)%2) + (x%3)*(1-(x%3)%2));
}