Dight Number

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
akasann

Dight Number

#1

投稿記事 by akasann » 8年前

DxLibの本を読みながら、間間にAOSの問題に取り組んでいます。データセット数を200以下という条件があります。この部分の解決策が思いつきません。どのような方法が考えられるのでしょうか?
問題内容としては二つの数を入力して、その和の桁数を出力する問題です。データセット数が複数入力のため、私が考えたものでは決まったセット数の入力となり、クリアしたことになりません。別の問題点が考えられるかもしれませんが・・・
なにかアドバイスなどありましたらお願いします。

コード:

#include<stdio.h>
#include<math.h>
#define N 200

int main(void){
	int a[N],b[N],c[N],i,n,d[N];

	for(i=0;i<N;i++){
		scanf("%d %d",&a[i],&b[i]);
		c[i]=a[i]+b[i];
	}
	
	for(i=0;i<N;i++){
		for(n=7;n>0;n--){
			if(pow(10.0,n)>c[i])
				d[i]=n;
		}
		printf("%d\n",d[i]);
	}
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: Dight Number

#2

投稿記事 by みけCAT » 8年前

akasann さんが書きました:DxLibの本を読みながら、間間にAOSの問題に取り組んでいます。
AOSとは何ですか?AOJの間違いではないですか?
akasann さんが書きました:データセット数を200以下という条件があります。この部分の解決策が思いつきません。どのような方法が考えられるのでしょうか?
scanfの戻り値をチェックして、データが読み込めていなかったら読み込みを終了して読み込めた数を記録し、その数だけ処理する、という方法が考えられます。
また、わざわざ全データを保持しなくても、1セットずつ読み込み・処理・出力を行い、読み込めなかったら終了する、という方法でもいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: Dight Number

#3

投稿記事 by あんどーなつ » 8年前

問題はこんな感じですか?

コード:

1 5
10 42
...
83 63
scanfの返り値が2か確認して、違っていたら終了します。

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: Dight Number

#4

投稿記事 by あんどーなつ » 8年前

Cの学習法についてですが、次の3通りだと思います。

(1) 書籍を読む

入門書はCを6, 7割理解するためのものです。間違いが比較的多いので、中級者より上の人はあまり使いません。
カーニハン・リッチー著「プログラミング言語C 第2版」はお金に余裕があれば、買ってもいいでしょう。

(2) インターネット(ブログ・何かのマニュアル)を読む

パッとプログラムを組みたい人におすすめです。printfやscanfで検索すると、日本人のかいたページや「何かの」Linux, BSD OSに入っているCのコンパイラの解説がすぐ出てきます。

たいていの言語には「標準ライブラリ」というものがついています。使っている言語で標準ライブラリが何の機能を提供しているのかを確認しておいたほうがいいです。例えばCの標準ライブラリは、ヘッダーファイル毎に解説が書いてありますが、そのヘッダーファイルが何個あって、それぞれ何という機能を提供しているかを調べます。

string.h : 文字列操作
math.h : 数学関連
stdio.h : I/O, ファイル操作
等々

(3) Cの仕様書と使用しているコンパイラのマニュアルを読む

そもそも仕様書とマニュアルの違いって何でしょうか?
何々言語の仕様書、と言った場合は、その言語の策定委員会が作成した資料になります。策定委員会はその言語が使いやすくなるように議論するために設置されます。C, C++の仕様書はISOが発行していますが、JISがそれを和訳した仕様書を作っているので、それを活用してもよいでしょう。JISの仕様書は文書ファイルの形で入手するには費用が掛かりますが、ブラウザで閲覧するのは無料です。

マニュアルは、コンパイラのベンダー(制作した企業や組織のこと)が作成した資料です。MicrosoftではMSDN, gccはmanコマンドで見ることができます。コンパイラの動作を正確に記述しているのは仕様書ではなくマニュアルです。ただし、C/C++の場合はほとんどの機能について仕様がきちんと実装できているので仕様書で議論する人が多いです。

仕様書・マニュアルは他の資料に比べて正確ですが、分量が多く読みづらいです。なので、最初は仕様書・マニュアルの所在と分量を確認するにとどめて、人と議論するときに該当の項目だけ参照する、くらいでいいと思います。

かずま

Re: Dight Number

#5

投稿記事 by かずま » 8年前

akasann さんが書きました:データセット数を200以下という条件があります。この部分の解決策が思いつきません。
データセット数 200以下という条件の意味は私もよくわかりません。
これぐらいならメモリに全部読み込めるから、そういうプログラムを作ってしまう
という罠にはめるつもりなんでしょうか?
入力データ数が不明の場合、通常は、EOF(入力の終わり)に達したかどうかチェック
しながら、処理を行います。
1文字ずつ読み込む場合は、while ((c = getchar()) != EOF) { ... }
1行ずつ読み込む場合は、whle (fgets(buf, sizeof buf, stdin) != NULL) { ... }
指定した書式で読み込む scanf の場合、while (scanf("%d", &i) == 1) { ... }
ということで、

コード:

#include <stdio.h>

int main(void)
{
    int a, b;  char s[12];

    while (scanf("%d%d", &a, &b) == 2)
        printf("%d\n", sprintf(s, "%d", a + b));
    return 0;
}

akasann

Re: Dight Number

#6

投稿記事 by akasann » 8年前

皆さん、いろいろアドバイスありがとうございます。AOJでした。間違えて入力していたみたいです。もう一度考え直してみます。

今はDxライブラリで手がいっぱいなので、その本を読み終わってから何か考えていこうかなと思います。両立していくのもありだと思いますが…

akasann

Re: Dight Number

#7

投稿記事 by akasann » 8年前

問題としては
入力が
1 9
4 7
78 89

出力が
2
2
3

みたいな感じになるような、足した桁数の数が出力されるような形です。
http://judge.u-aizu.ac.jp/onlinejudge/d ... 02&lang=jp
問題の詳しい内容はこちらに張っておきます。

閉鎖

“C言語何でも質問掲示板” へ戻る