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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2059閲覧

C++で重複する数字が含まれているか判定するプログラムを作る

langhtorn

総合スコア104

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/15 10:17

前提・実現したいこと

整数に重複する数字が含まれているか判定するプログラムを作りたいのですがうまくいきません。

発生している問題・エラーメッセージ

どんな数字をいれても"重複する数字が含まれているになってしまう"

該当のソースコード

C++

1#include<iostream> 2bool has_duplicate_digits(int x); 3int main(void) 4{ 5 int x,c; 6 std::cout<<"整数を入力してください"; 7 std::cin>>x; 8 //has_duplicate_digits(x);//関数 9 if(has_duplicate_digits(x)){ 10 std::cout <<"重複する数字が含まれている\n"; 11 }else{ 12 std:: cout <<"重複する数字は含まれていない\n"; 13 } 14 return 0; 15} 16bool has_duplicate_digits(int x) 17{ 18 int a,i,b; 19 int counts[10]={}; 20 for(i=0;i<10;i++){ 21 if(x!=0){ 22 a=x%10; 23 //printf("%d",a); 24 x/=10; 25 }else{ 26 break; 27 } 28 } 29 if(a==0){ //出現した文字数をカウントする 30 counts[0]++; 31 if(counts[0]>=2){ 32 b++; 33 } //文字数が2以上だったらtrue 34 }else if(a==1){ 35 counts[1]++; 36 if(counts[1]>=2){ 37 b++; 38 } 39 }else if(a==2){ 40 counts[2]++; 41 if(counts[2]>=2){ 42 b++; 43 } 44 }else if(a==3){ 45 counts[3]++; 46 if(counts[3]>=2){ 47 b++; 48 } 49 }else if(a==4){ 50 counts[4]++; 51 if(counts[4]>=2){ 52 b++; 53 } 54 }else if(a==5){ 55 counts[5]++; 56 if(counts[5]>=2){ 57 b++; 58 } 59 }else if(a==6){ 60 counts[6]++; 61 if(counts[6]>=2){ 62 b++; 63 } 64 }else if(a==7){ 65 counts[7]++; 66 if(counts[7]>=2){ 67 b++; 68 } 69 }else if(a==8){ 70 counts[8]++; 71 if(counts[8]>=2){ 72 b++; 73 } 74 }else if(a==9){ 75 counts[8]++; 76 if(counts[9]>=2){ 77 b++; 78 } 79 } 80 if(b>=1){ 81 return true; 82 }else{ 83 return false; 84 } 85}

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

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

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

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

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

guest

回答3

0

コンパイラは何ですか?
もし g++ なら -Wallオプションを付けてみると警告が出ます。
b が初期化されていません。

次に x がある値の時にどうなるかコードを追いかけてみてください。
例えば x が 314 のとき、a の値は 4 1 3 と変化します。
x は 314 31 4 0 と変化します。

forループを抜けると a には最上位の桁の数 4 が入っています。
これだけを見て重複を判断できるはずがありません。

C++

1bool has_duplicate_digits(int x) 2{ 3 int counts[10] = { }; 4 do { 5 if (++count[x % 10] > 1) return true; 6 } while (x /= 10); 7 return false; 8}

投稿2020/05/15 18:32

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

C++

1bool has_duplicate_digits(int x) { 2 int counts[10] = {0}; 3 // 各数の出現頻度をcountsに求め、 4 while ( x != 0 ) { 5 counts[x % 10]++; 6 x /= 10; 7 } 8 // counts 内に2以上のものがあれば重複あり 9 for ( int i = 0; i < 10; ++i ) { 10 if ( counts[i] > 1 ) return true; 11 } 12 return false; 13}

あるいは

C++

1#include <string> 2#include <set> 3 4bool has_duplicate_digits(int x) { 5 std::string digits = std::to_string(x); 6 return std::set<char>(digits.begin(), digits.end()).size() != digits.size(); 7}

投稿2020/05/15 11:02

編集2020/05/15 17:45
episteme

総合スコア16614

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

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

episteme

2020/05/19 06:42

コレ↓で十分かな。 bool has_duplicate_digits(int x) { int counts[10] = {0}; while ( x != 0 ) { if ( ++counts[x % 10] > 1 ) return true; x /= 10; } return false; }
guest

0

b0で初期化してください。
あとforループの閉じる位置間違えていると思います。

投稿2020/05/15 10:49

編集2020/05/15 10:51
aaharu

総合スコア441

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問