どなたかプログラミングしてください
m・r
2004/07/29(木) 15:05:02
どなたかこのプログラミングできる方いませんか?もし可能ならお願いします。
整数p,qをキーボードからあたえる。このp,qに対し次のような数列{ai}を作る。
a(i+2) + pa(i+1) + qa(i) = 0
a0,a1が決まれば{ai}が一通りに決まることは明らかである。
そこでつぎに整数a0,a1をキーボードからあたえる。
キーボードから非負整数nをあたえる。このときa0,a1,a2・・・・anを書き出せ。
例、(p,q)= (-1,-1) a0=1 a1=1 のときn=5に対して答え:1,1,2,3,5,8
↑
2004/07/29(木) 15:19:39
言語は?C言語の例
2004/07/29(木) 17:16:53
#include<stdio.h>#define P -1.0
#define Q -1.0
#define N 10000
int main(){
double a[N];
int i;
int n;
printf("a0を入力してください:");
scanf("%lf",&a[0]);
printf("a1を入力してください:");
scanf("%lf",&a[1]);
printf("nを入力してください:");
scanf("%d",&n);
for(i=0;i<n-2;i++){
a[i+2]=-P*a[i+1]-Q*a[i];
}
for(i=0;i<n;i++){
printf("a%d = %f\n",i,a[i]);
}
}
書いてみた。pとqはキーボードから入力しないでいいみたいなんで
プログラムの最初に(p,q)=(-1,-1)と与えてあります。
キーボードで入力したnは[2,10000]の範囲にしてください。
そうじゃないとエラーがでます。実行してみてないので
エラーがでる可能性があります。
C言語の例
2004/07/29(木) 17:19:31
あ、a[]は整数なのか。ちょっと修正しないといけないな。#include<stdio.h>
#define P -1
#define Q -1
#define N 10000
int main(){
int a[N];
int i;
int n;
printf("a0を入力してください:");
scanf("%d",&a[0]);
printf("a1を入力してください:");
scanf("%d",&a[1]);
printf("nを入力してください:");
scanf("%d",&n);
for(i=0;i<n-2;i++){
a[i+2]=-P*a[i+1]-Q*a[i];
}
for(i=0;i<n;i++){
printf("a%d = %d\n",i,a[i]);
}
}
これで大丈夫かと。
C言語の例'
2004/07/29(木) 20:58:06
p, qもキーボードから入力しなければならないみたいなんで勝手に修正。あと、a[n-1]までしか表示されないのも勝手に修正。
#include<stdio.h>
#define N 10000
int main(){
int a[N];
int p, q;
int i;
int n;
printf("pを入力してください:");
scanf("%d",&p);
printf("qを入力してください:");
scanf("%d",&q);
printf("a0を入力してください:");
scanf("%d",&a[0]);
printf("a1を入力してください:");
scanf("%d",&a[1]);
printf("nを入力してください:");
scanf("%d",&n);
for(i=0;i<=n-2;i++){
a[i+2]=-p*a[i+1]-q*a[i];
}
for(i=0;i<=n;i++){
printf("a%d = %d\n",i,a[i]);
}
}
C言語の例'
2004/07/29(木) 21:05:47
てかオリジナル作った。#include<stdio.h>
int main(){
int i, n, a, b, c, p, q;
printf("pを入力してください。:");
scanf("%d", &p);
printf("qを入力してください。:");
scanf("%d", &q);
printf("a0を入力してください。:");
scanf("%d", &a);
printf("a1を入力してください。:");
scanf("%d", &b);
printf("nを入力してください。:");
scanf("%d", &n);
printf("%d, %d", a, b);
for(i = 0; i <= n-2; i++)
{
c = - p * b - q * a;
printf(", %d", c);
a = b; b = c;
}
return 0;
}
.
2004/07/29(木) 23:06:55
宿題か何かか?Fortranの例
2004/07/30(金) 01:14:20
parameter(m=10000)integer a(m)
integer p,q
write(6,*) 'p = ?'
read(5,*) p
write(6,*) 'q = ?'
read(5,*) q
write(6,*) 'a0 = ?'
read(5,*) a(1)
write(6,*) 'a1 = ?'
read(5,*) a(2)
write(6,*) 'n = ?'
read(5,*) n
do i=3,n+1
a(i)=-p*a(i-1)-q*a(i-2)
end do
write(6,*) (a(i),i=1,n+1)
stop
end
みんな
2004/07/30(金) 04:56:27
人の宿題やってやるなんて親切だねめずらしく
2004/07/30(金) 11:23:15
荒れないな。こういうのはたいていクソすれ立てるな、削除依頼だしとけよ、で終わりなんだが。
どうしよう
2004/07/30(金) 11:34:52
もう、殆ど夏休み何じゃない?C++の例
2004/07/30(金) 11:35:35
#include<iostream>#define N 10000
int main(){
int a[N];
int p,q,n;
int i;
cout << "pを入力してください:";
cin >> p;
cout << "qを入力してください:";
cin >> q;
cout << "nを入力してください:";
cin >> n;
cout << "a0を入力してください:";
cin >> a[0];
cout << "a1を入力してください:";
cin >> a[1];
cout << "a0 " << a[0] << ""\n";
cout << "a1 " << a[1] << ""\n";
for(i=0;i<n-2;i++){
a[i+2]=-p*a[i+1]-q*[i];
cout << i+2 << " " <<a[i+2] << "\n";
}
}
xyzzy
2004/07/30(金) 12:38:13
練習のために作ってみた。あんまりきれいじゃないですね。
(defun foo (ini p q n)
(if (< n 2) ini
(let ((prev (foo ini p q (- n 1))))
(cons (+ (- (* p (car prev)))
(- (* q (second prev))))
prev))))
(defun bar (a0 a1 p q n)
(interactive "na0=:\nna1=:\nnp=:\nnq=:\nnn=:")
(insert (format nil "~{~D,~}" (reverse (foo (cons a0 (cons a1 nil)) p q n))))
(delete-backward-char))
↑
2004/07/30(金) 16:13:41
LISP使いカッコいい!!↑↑
2004/07/30(金) 17:31:18
Meadowでやったら「bar」が返ってきた。Lispって賢いんだろ?
xyzzy
2004/07/30(金) 23:06:54
barのほうが間違ってたりして場当たりに修正したらさらに汚くなりました。
(defun bar (a0 a1 p q n)
(interactive "na0=:\nna1=:\nnp=:\nnq=:\nnn=:")
(if (zerop n)
(insert (format nil "~D" a0))
(progn (insert (format nil "~{~D,~}" (reverse (foo (cons a1 (cons a0 nil)) p q n))))
(delete-backward-char))))
>↑
たぶんそれでできてるので
M-x barで呼び出してみて。
lispで書かれていて
2004/07/31(土) 00:46:33
つい笑ってしまった。python使い
2004/08/03(火) 00:38:24
キーポイントは計算誤差が入るからfloatを使ってはいけないってとこだな。そうとでも考えなきゃ簡単すぎるからな。
python使い
2004/08/03(火) 00:47:17
とおもったらa[i+2]に係数ついてないのか。なーんだ。p=input("input p: ")
q=input("input q: ")
a0=input("input a0: ")
a1=input("input a1: ")
n=input("n")
a=[a0,a1]
i=1
while i<n:
i+=1
a.append(-(p*a[-1]+q*a[-2]))
print a
これで終わりか…。
もっと歯ごたえのある問題希望。
python使い
2004/08/03(火) 00:59:34
練習のためにEmacsLispで。(defun foo (p q a0 a1 n)
(if (<= 0 n)
(cons a0 (foo p q a1 (- (+ (* p a1) (* q a0))) (- n 1)))))
(foo -1 -1 1 1 5)
入力部分は作ってない。
python使い
2004/08/03(火) 01:38:32
でまあ夏休みだし新しいことに挑戦しようってわけでPrologをダウンロードしてみたんだがfoo(P, Q, A0, A1, N, Result):-
N > 0, NewN is N-1, NewA1 is -(P*A1)-(Q*A0), foo(P, Q, A1, NewA1, NewN, NewResult), Result is NewResult.
foo(P, Q, A0, A1, 0, Result):- Result is A0.
最後のを求めるだけならこれでいいんだけど、
全部をリストで返す方法がわからない。Prologのリストはむずかしー。
記念かきこ、短くできん。(重複だがC)
2004/08/03(火) 07:40:57
#include <stdio.h>#define N 2000
int main(){int a[N];int n, p, q;int i;printf("p?: ");scanf("%d",&p);printf("q?: ");scanf("%d", &q);printf("a0?: ");scanf("%d",&a[0]);printf("a1?: ");scanf("%d",&a[1]);printf("n?: ");scanf("%d", &n);printf("a0 = %d\n",a[0]);printf("a1 = %d\n",a[1]);for(i=0;i<=n-2;i++){a[i+2]=-p*a[i+1]-q*a[i];printf("a%d = %d\n",i+2,a[i+2]);}return 0;}
python使い
2004/08/03(火) 19:26:23
短くするんだったらv=[input(x+"?:") for x in ["p","q","n","a0","a1"]];a=v[3:]
for i in range(1,v[2]):a.append(-(v[0]*a[-1]+v[1]*a[-2]))
print a
って感じかな。
結局のところ入力部分がロジックと無関係にかさばるのでそこをリスト閉包やmapなんかで抽象化する機能がある言語化どうかが重要なファクターになるわけですな。
まぁでも、短くするのはパズルとしては面白いけど
商業的な価値はそれほどではないから別にどうでもいいや。
アポロン
2004/09/07(火) 00:47:25
Pascalが出てないのが悲しい・・・。Delphi使いいないの?
sicp
2004/09/08(水) 10:44:20
nまで全部じゃなくてn番目だけを求める問題にすると少し面白い。n = 10^6 くらいにして。
追加発言



