- 締切済み
教えて下さい
考え方が分からず困っています。プログラミングを0からある程度まで4日で終わらせる講座で悪戦苦闘しています。以下のような課題が出て、必死で考えているのですが分かりません。考え方のヒントを 頂ければと思っています。他力本願と思われるかもしれませんが、本当に困ってしまっているのでどなたかよろしくお願い致します。 下記のプログラムにおいて,numcountは,値が0 ~M -1 の範囲の大きさN のint型の配列を引数として渡されると(ただし,M, N は正の整数),同じ値が複数ある時はそれを1 個とみなしてその配列中の数の個数を返す関数である.例えば,配列の値を7, 4, 8, 2, 4, 6, 1, 6, 4, 5 とすると,(ダブリを省くと) この中には,7, 4, 8,2, 6, 1, 5 の7 個があるので,関数numcountは7 を返す. これは,例えば,0 ~M -1 の範囲でどんな数が出てきたかをチェックしておき(ヒント: 大きさM のint型の配列を用い,最初はすべて0に初期化しておき,数iが現れたら,そのi番目を1にすればよい), 最後に1度でも出てきたものを数えれば求めることができる.関数numcountを,下記のプログラムの/* INSERT HERE */の部分に挿入できるように書け.(提出はプログラム全体) #include <stdio.h> #define M 10 /* 適当な正整数(数の範囲が0 ~M -1) */ #define N 10 /* 適当な正整数(入力する数の個数)*/ /* INSERT HERE */ int main(void) { int i, a[N]; /* a[0]~a[N-1] の値を入力する*/ for(i= 0; i< N; i++) { printf("a[%1d] = ? ", i); scanf("%d", &a[i]); } printf("numcount= %3d¥n", numcount(a)); return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ryuzoji21
- ベストアンサー率50% (6/12)
bool num[N]; //memsetでやってもいいけれど for(int i = 0;i < N;i++){ num[i] = false; } int numcount(int a[N]){ //数の個数=0 int number = 0; //引数を最初から最後まで調べる for(int i = 0;i < N;i++){ //もしnum[]に登録されていなければ if(num[a[i]] == false){ //登録する&数の個数を1増やす num[a[i]] = true; number++; } } return number; } 読みにくなったうえ、下手なプログラムですみません。 馬鹿正直に書くとおそらくこうなります。
- abcdef220
- ベストアンサー率43% (7/16)
間違っていたらすいません。 例えば数字が4,3,7,6,5,4,2と与えられたら、 a[4]=1; a[3]=1; a[7]=1; ・・・・ みたいにしていき1の数を数えれば良いのでは? ダブリの数が出ても、さらに1を代入するだけです。