ページ 1 / 1
Dight Number
Posted: 2016年11月10日(木) 00:05
by akasann
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;
}
Re: Dight Number
Posted: 2016年11月10日(木) 01:11
by みけCAT
akasann さんが書きました:DxLibの本を読みながら、間間にAOSの問題に取り組んでいます。
AOSとは何ですか?
AOJの間違いではないですか?
akasann さんが書きました:データセット数を200以下という条件があります。この部分の解決策が思いつきません。どのような方法が考えられるのでしょうか?
scanfの戻り値をチェックして、データが読み込めていなかったら読み込みを終了して読み込めた数を記録し、その数だけ処理する、という方法が考えられます。
また、わざわざ全データを保持しなくても、1セットずつ読み込み・処理・出力を行い、読み込めなかったら終了する、という方法でもいいでしょう。
Re: Dight Number
Posted: 2016年11月10日(木) 08:54
by あんどーなつ
問題はこんな感じですか?
scanfの返り値が2か確認して、違っていたら終了します。
Re: Dight Number
Posted: 2016年11月10日(木) 11:03
by あんどーなつ
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
Posted: 2016年11月10日(木) 16:15
by かずま
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;
}
Re: Dight Number
Posted: 2016年11月10日(木) 20:23
by akasann
皆さん、いろいろアドバイスありがとうございます。AOJでした。間違えて入力していたみたいです。もう一度考え直してみます。
今はDxライブラリで手がいっぱいなので、その本を読み終わってから何か考えていこうかなと思います。両立していくのもありだと思いますが…
Re: Dight Number
Posted: 2016年11月10日(木) 20:29
by akasann
問題としては
入力が
1 9
4 7
78 89
出力が
2
2
3
みたいな感じになるような、足した桁数の数が出力されるような形です。
http://judge.u-aizu.ac.jp/onlinejudge/d ... 02&lang=jp
問題の詳しい内容はこちらに張っておきます。