質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

5199閲覧

C言語 配列要素の種類数を数える

kater

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/14 14:38

前提・実現したいこと

C言語 paizaの問題集にあった問題です 
C言語で配列を使ってときたいです。

配列 A の要素数 N と配列 A の各要素 A_1, A_2, ..., A_N が与えられるので、配列 A には何種類の値が含まれているかを求めたい 入力は最初に要素数N、続いて配列の要素が改行区切りで与えられる

条件 ・1 ≦ N ≦ 100
・0 ≦ A_i ≦ 100 (1 ≦ i ≦ N)

入力例  出力
5       3
1
2
3
2
1

この場合配列の要素数は5 要素は1,2,3,2,1 1,2,3の3種類があるので出力結果は3となる

試したこと

include <stdio.h>
int main(void){
char buf[100];
int i,n,num;
int count=0;
fgets(buf, sizeof(buf), stdin);
sscanf(buf,"%d",&n);
int a[120];
for(int i = 0;i<n;i++){
fgets(buf, sizeof(buf), stdin);
sscanf(buf,"%d",&num);
a[i] = num;
}
}
この続きで悩んでいます

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

入力値 A_i が 100までと小さいので、
char の配列に入力の値を重複しないように保存しておき、
入力ごとに既に保存されていないかを strchr で見るようにしてみました。

#include <stdio.h> // scanf #include <string.h> // strchr int main(void) { char c[100] = ""; int n, a, k = 0; scanf("%d", &n); while (--n >= 0) { scanf("%d", &a); if (!strchr(c, a+1)) c[k++] = a+1; } printf("%d\n", k); }

入力値 0 はちょっとまずいので、入力値には +1 のゲタをはかせています。
while ループで入力が終わったら、結果の値は既に求まっています。

まあ、いろいろなやり方があるということで、他のやり方も考えてみてください。

投稿2020/11/14 15:49

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Aiの値は高々101通りなので、入力を配列flagに記録していき、初出ならcntに1加算する、といった処理で良いと思います

c

1#include <stdio.h> 2 3int main(){ 4 int n,a,cnt=0; 5 char flag[101] = {}; 6 scanf("%d", &n); 7 for (int i=0; i<n; i++) { 8 scanf("%d", &a); 9 if (flag[a] == 0) cnt++; 10 flag[a] = 1; 11 } 12 printf("%d\n", cnt); 13}

投稿2020/11/14 15:17

編集2020/11/14 16:08
kairi003

総合スコア1330

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Aiの数は0から100の整数です。

このようなときは先にフラグ配列を用意するのが楽です。

C

1char flags[101]; 2memset(flags, 0x00, 101);

と用意しておいて、整数を変数numに収めた後に

C

1flags[num] = 1;

としていけば良いです。こうすれば最終的にフラグ配列中の1の数を数えれば良いです。

投稿2020/11/14 15:15

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問