お蔵入り

値 n を入力させて、1 から n までの総和を計算し、結果を表示させるプログラムを作成。ただし、入力としては、1~1000000までの数のみを受け付ける。

% ./a.out
1 からいくつまでの足し算をしますか? [1-1000000] 3
1 から 3 まで足した結果は 6 です。

2008-05-07 10:40の質問
この質問は、30日間解決しなかったために自動的に質問が一旦閉じられました。
Ads By Google

回答(3)

3.

2008-05-07 13:50:34
#include <stdio.h>
#include <assert.h>
 
unsigned long sum(unsigned long n){
    assert(sizeof(unsigned long)>4);

    if(n%2){
        return (n+1) / 2 * n;
    } else {
        return n / 2 * (n + 1);
    }
}
 
int main(void){
    unsigned long n;
 
    printf("1 からいくつまでの足し算をしますか? [1-1000000]");
    scanf("%lu", &n);
    
    return (printf("1 から %lu まで足した結果は %lu です。\n", n, sum(n)));
}
自信度 : 自信なし 回答レベル : 回答

4.

2008-05-07 20:36:11
手計算によれば、百万までの総和は5000,0050,0000、ざっと五千億になります。
32ビットのコンピュータでは符号無し整数表現が42,9496,7295までなので計算不可能。
64ビットのコンピュータでは符号無し整数表現が1844,6744,0737,0955,1615、およそ千八百四十四京という超弩級天文学的摩訶不思議数になります。
こんな答えを出して、読上げられますか?

指導者の趣味がプンプン臭う問題ですね。
それよりも、桁数の大きな算用数字を読上げ形式に変換する問題の方が易しいようで難しいものです。
ちなみにこの問題を今年の新人にやらせてみたところ、優秀な新人さえバグをだしていました。

5.

2008-05-08 16:45:45
#include <stdio.h>
#include <assert.h>
 
unsigned long long sum(unsigned long v){
    unsigned long long n;
    assert(sizeof(unsigned long long)>4);
 
    n=v;
    if(n%2){
        return (n+1) / 2 * n;
    } else {
        return n / 2 * (n + 1);
    }
}
 
void print_num(unsigned long long n){
    unsigned long d[3];
    int i;
    for(i=0;i<3;i++){
        d[i]=n % 100000000;
        n /= 100000000;
    }
    printf("%08lu%08lu%08lu",d[2],d[1],d[0]);
}
 
int main(void){
    unsigned long n;
 
    printf("1 からいくつまでの足し算をしますか? [1-1000000]");
    scanf("%lu", &n);
    
    printf("1 から %lu まで足した結果は ");
    print_num(sum(n));  /* printf で unsigned long long が扱えない */
    printf(" です。\n");
 
    return 0;
}
//これOK?
//またもっとでかい数字が?
自信度 : 自信なし 回答レベル : 回答
Ads By Google

コメント(8)

2008-05-07 12:29:07

1.「質問」をして下さい。
 例:~したいのですが、どのようにすればよいでしょうか?
2.過去の質問を処理して下さい。解決にならないなら、その旨コメントしましょう。

#2.  BLUEPIXY
2008-05-07 13:43:01

unsigned long が32ビット以上あればいいなぁ。
でも、多分、無いんだろう。
(そういう問題なんでしょう、知らんけど)

#3.  BLUEPIXY
2008-05-07 14:53:43

範囲チェックしてない>3

2008-05-07 15:42:10

見方によっては、ナレッジ回答者の水準を試されているような気がする…。

#5.  BLUEPIXY
2008-05-07 18:17:14

#4>ナレッジ回答者の水準を試されている
(((( ;゚д゚)))そうだったんだ!

では、どうすれば良かったんでしょう?
0)回答祭りにする
1)コメント祭りにする
2)「違反を報告する」をやってみる
3-0)多倍長演算ライブラリソースを検索して示す
3-1)多倍長演算をこの問題ができるぐらいに実装する
3-2)多倍長演算を汎用的にできるように実装する
4)いやいや日本語表示もスタンダード的に書くべきだ
5)scheme 等の別の言語を薦める
6)その他

2008-05-07 20:46:53

学生にこんな"こまい"問題をやらせて苛めるよりも、もっと企業寄りの、つまり実戦向きの出題をすべき。

…あっ、そうか!
学校の先生は企業並みソフト開発をした経験ゼロだった!

C言語の"こまい"部分は、実戦を通して自然と解ってくるものですな。
新人にpack/unpackの問題をやらせたら、

「初めて経験する問題です」
「この問題にどんな意味があるのですか」

ときた。学校で教える内容なんてこんなもんですよ。

2008-05-07 23:23:44

>>#6
この問題は,プログラムを仕事で使う人にとって,知っているべき問題を経験させてくれるのだから,決して悪い問題ではありません.
>>4
で,最大値になるときの計算結果を批判しているようですが,プログラミングは計算結果を学ぶものではないですし,表示が見辛ければどうするのかという問題も重要なことです.

それから,大学には企業で働いていた先生もたくさんいますので,ご批判は的外れですね.

#8.  BLUEPIXY
2008-05-18 02:43:22

他のプログラムを呼び出すのはアリなんでしょうか?
とにかく、返事がないので、話は進まんね。

トラックバック

トラックバックURL: