<お題:小町算>
1,2,3,4,5,6,7,8,9(数字の並びは固定)である。
これらの数の間に+、-、何も入れないという演算子をいれて、計算
する。そして、計算結果が100になる組み合わせを、すべて表示する
プログラムを作成せよ。100になるのは、12とうりのはず。
(夏休みの課題だ。今のところ27行。)
<注意>
1行に2文以上書かない。
ヘッダー、DLL,COM,など、ソースレベルおよびバイナリレベルの外部ルーチン
は禁止する。
ソースコードは、すべてカウントする。(コメント、ヘッダなど)
プログラムは、コンソールアプリケーションとする。
入出力は、ストリーム入出力を使用する。
誰かたすけて~。小町算中毒に・・・
君なりに27行で書けたならそれで良いじゃないか。
課題なんだし自分でやったのを胸を張って提出すれば?
>>1 >何も入れないという演算子
ごめん、それなに?
2 3 だったら二十三ということ?
4 :
デフォルトの名無しさん:01/08/26 16:40
>入出力は、ストリーム入出力を使用する。
これだとタイトルの(C言語)というのはウソになるね・・・。
5 :
デフォルトの名無しさん:01/08/26 16:41
>>4 演算部はCで実装しろってことじゃない?
何の意味があるのかわからないが。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, s, sign[10];
long n, x;
for (i = 1; i <= 9; i++) sign[i] = -1;
do {
x = n = 0; s = 1;
for (i = 1; i <= 9; i++)
if (sign[i] == 0) n = 10 * n + i;
else {
x += s * n; s = sign[i]; n = i;
}
x += s * n;
if (x == 100) {
for (i = 1; i <= 9; i++) {
if (sign[i] == 1) printf(" + ");
else if (sign[i] == -1) printf(" - ");
printf("%d", i);
}
printf(" = 100\n");
}
i = 9; s = sign[i] + 1;
while (s > 1) {
sign[i] = -1; i--; s = sign[i] + 1;
}
sign[i] = s;
} while (sign[1] < 1);
return EXIT_SUCCESS;
}
[1] 1+2+3+4+5+6+7+8*9 = 100
[2] 1+2+3-4+5+6+78+9 = 100
[3] 1+2+3-4*5+6*7+8*9 = 100
[99] 123-4-5-6-7+8-9 = 100
[100] 123+45-67+8-9 = 100
[101] 123-45-67+89 = 100
Googleで検索したらわんさかでてくるな。2chで聞かないでも
どうにでもなる話なんじゃないのか?
>>1 12通りじゃ幾らなんでも少なすぎでしょ。正解が出てこそナンボ、
不正解プログラムが短くても意味無いと思う。
>これらの数の間に+、-、何も入れないという演算子をいれて
と"数の間"いうことは、数式先頭のマイナス符号は無効なのかね?
その場合101通り。先頭のマイナスを認めれば162通りか。
11 :
デフォルトの名無しさん:01/08/26 17:10
6 はgcc だと通らない。
12 :
デフォルトの名無しさん:01/08/26 17:11
>これらの数の間に+、-、何も入れないという演算子をいれて
「数の間」が課題なら、答えは11通りだね。先頭の単項演算を考慮して12通り。
>>1の出題内容と自己の解はアンマッチ。
先頭の単項演算を考慮して12通りでした。
あと、何も入れないとは78とか123とかです。
説明不足でもうしわけありません。
私は6さんの考え方に近いです。
「自分でやれ!」という意見もあるかと思いますが、ごもっともです。
考え込んで2週間がたちました。27行から減りません。
夏休みもあとわずかになりました。どうかお力を貸してください。
よろしくお願い致します。
>>13 なんか
>>2と同じことを書くけど、何行だかしらんがとにかく
自分で書けたなら、それで十分じゃないかと思うのだが。
15 :
デフォルトの名無しさん:01/08/27 17:01 ID:NEa0N4C6
そう。そして、自分の実力はこの程度なのだと実感し、
さらに精進に励むのだ。
7行スレで訊いてみては如何
>>161 7行スレで聞いておいだされたんじゃなかったっけ?
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void){
long i,j,k,flag,sum,temp,n = 0;
char sz[128];
for(i=0;i<(long)pow((double)3,(double)9);i++){
flag = sum = temp = *sz = 0;
for(j=0;j<9;j++){
k = i / (long)pow((double)3,(double)j) % 3 - 2;
if(j==0 && k==0) break;
sum = (k==-1) ? sum : (sum + temp * (flag + 1));
flag = (k==-1) ? flag : k;
temp = (k==-1) ?(temp * 10 + (j + 1)) : (j + 1);
*(long *)(sz + strlen(sz)) = (k==-1) ? ('1' + j) : (0x2B - k) + ('1' + j) * 0x100;
}
if((sum + temp * (flag + 1))==100) printf("%04d %s = 100\n",++n,sz);
}
return 0;
}
20 :
芥:01/08/28 01:40 ID:MUWorKro
#include<stdio.h>
char s[]=" 1 2 3 4 5 6 7 8 9 =100";
int p=0;
void S(int d, int e, int a, char x)
{
s[(d-1)*2]=x;
if(++d>9){
if(e+a==100)printf("[%2d]%s\n",++p,s);
return;
}
S(d, e+a, d, '+');
S(d, e+a, -d, '-');
S(d, e, 10*a+(a>0?d:-d), ' ');
}
int main()
{
S(1, 0, 1, ' ');
S(1, 0,-1, '-');
return 0;
}
21 :
1です。:01/08/28 17:00 ID:mSc.uT8s
19さん、20さん、すごいですね。
僕はこういうやり方はまったく思いつきませんでした。
なぜ、このようなやり方でできるのか、どうすれば問題が解決するのか
など大変勉強になります。自分もお二人のプログラムを参考にして、
自分のアルゴリズム能力を向上させていきたいです。
それにしてもすごいですね!!
>>20 FreeBSDのgccではできない
% gcc 20.c
20.c: In function `S':
20.c:6: syntax error before character 0241
%
>>1 行を少なくするというのは
アルゴリズムの本質的な部分と関係ない所の話になってくるので
やっても(無駄とはいわないが)アルゴリズムの勉強にはならないと思う。
25 :
デフォルトの名無しさん:01/08/29 17:12 ID:7WZsAq3s
26 :
デフォルトの名無しさん:01/08/29 17:30 ID:jrovamws
>>1は自分で考えろ。卑怯者。
そのまんま出すとバレるぞ。
19をちょっと分かりやすくしてみたよ。endianにも非依存。
#include <stdio.h>
#include <string.h>
long s[3] = { 0, 1, -1 };
char sgn[3] = {0, '+', '-'};
int main()
{
long k, n=0;
for (k = 0; k < 3*3*3*3*3*3*3*3*3; k++) {
long i, l, c, x=0, d=0;
char buf[256], *p = buf;
for (i = l = 1; i <=9; i++, l *= 3) {
d = (c = (k/l)%3) ? (x += d, s[c] * i) : (d * 10 + (d < 0 ? -i : i));
(!c || ( *p++ = sgn[c] )) && (*p++ = ('0'+i)) && (*p=0);
}
if ((k%3) && x + d == 100) {
printf("[%d] %s=%d\n", ++n, buf, x+d);
}
}
}
29 :
デフォルトの名無しさん:01/08/31 23:14 ID:VrhfaGck
>>27おまえも卑怯だな。(笑)
そのまんま出すわけね~だろボヶ~~~。
>>29 変数かえてもアルゴリズムが同じで結局バレ(藁
小町算もわからんようなアホゥには何言っても無駄。
31 :
パル生:01/09/01 00:54 ID:oskLLM56
オレもいただきます(w
あまり人にみられたくないのでsage進行でいこうぜ。
32 :
デフォルトの名無しさん:01/09/01 01:15 ID:ezoDv4b.
>>30 おいおいアルゴリズムなんざどれだけでもかえれるぜ。
発展させていけばいいんだよ。
変数しか変えれないおまえといっしょにするな。
34 :
デフォルトの名無しさん:01/09/01 01:23 ID:ezoDv4b.
おっと。
わりぃ。わりぃ。
35 :
デフォルトの名無しさん:01/09/02 16:59 ID:udxJtb/c
俺もいただき。
どうせ大半のやつらはネットに落ちているソースを改造するのだから。
そのまんま出してバレたとしたら
先生が2ちゃんねらってこともバレますね。
38 :
デフォルトの名無しさん:01/09/03 09:10 ID:9o60VuWE
#include <con>
39 :
○岡:01/09/04 16:42 ID:PtDZjrVA
ちゃんとわかってます。
40 :
教師:01/09/06 12:44 ID:7NJjKkl.
今日、生徒に教えられてここに来てみました。
他人のソースプログラムを真似(類似)した生徒は減点対象にします。
もちろんココのソースプログラムも減点対象です。
41 :
教師:01/09/06 12:47 ID:7NJjKkl.
インターネットに落ちているソースプログラムも減点対象です。
どっかの問題集からパクッた問題を出すのも減点じゃ
43 :
デフォルトの名無しさん:01/09/06 21:16
これって、問題の書き方が悪いのでもっと短くなる。
>1,2,3,4,5,6,7,8,9(数字の並びは固定)である。
>これらの数の間に+、-、何も入れないという演算子をいれて、計算
>する。
はい、机上で計算しましょう。
>そして、計算結果が100になる組み合わせを、すべて表示する
>プログラムを作成せよ。
はい、机上の計算結果を表示するルーチンのみをプログラムで作成
しましょう。
6行でできるぞ。
#include <stdio.h>
int main()
{
printf("答え(机上で計算した結果を書いてね)\n");
return 0;
}
あいまいな問題を出したほうが悪いので上記でも正解になるはず。