番号が一意の数字しかないかどうかを確認するにはどうすればよいですか。 -- c フィールド 関連 問題

how do i check if a number has only unique digits?












4
vote

問題

日本語
たとえば、2345は、3桁が2回表示されていないため、3324が1倍になっていないため、固有の数字は固有の数字です。私は%を使ってみましたが、私は(コード)を示していますが、私は数字を得なかった、編集:あなたは文字列を使うことができません <事前> <コード> number%10==number%100||number%10==number%1000||number%100==number%1000
英語

for example, 2345 is a unique digit number because no digit is shown twice but 3324 isn't a unique number because 3 is there twice. I tried using % but I as (code) shows but I didn't get digits I got numbers, edit: you cant use strings

number%10==number%100||number%10==number%1000||number%100==number%1000 
</div
  
   
   

回答リスト

5
 
vote

デジットがまだ見られたかどうかを示すために10のフラグの配列を使用することができます。ループ内の数字を描き、単位桁を抽出し、数字が見られたかどうかを確認し、数字が見られたかどうかを確認し、次の反復の数字を10分割してください。

@Bathshebaによって指摘されているように、マイナスを扱うときにいくつかの注意が必要です 数字。

例えば:

<事前> <コード> buffer[5]3

<コード> buffer[5]4 および buffer[5]5 を処理する必要があるが、 site1 -> site2616 を処理するものが使用できる場合は、別の機能が必要な場合があります。 buffer[5]7 を次のように処理するもののもの:

<事前> <コード> buffer[5]8

buffer[5]9 および %04d0 を同じ方法でサポートするのに役立つと思います。

<事前> <コード> %04d1
 

You could use an array of 10 flags to indicate whether a digit has been seen yet. Work your way through the number in a loop, extracting the units digit, checking whether the digit has been seen, flagging the digit as seen, and dividing the number by 10 for the next iteration.

As pointed out by @Bathsheba, some care is needed when dealing with negative numbers.

For example:

int unique(long long int number) {     char seen[10] = {0};      while (number) {         int digit = number % 10;          number /= 10;         if (digit < 0) {             /*               * The number was negative.  Make it positive.              * (Note: Checking the number is negative before the while              * loop could fail when number is LLONG_MIN, so do it here              * instead.)              */             digit = -digit;             number = -number;         }         if (seen[digit]++)             return 0; /* not unique */      }      return 1; /* unique */  } 

Separate functions may be needed if it is necessary to deal with both long long int and unsigned long long int, but the one that handles long long int can make use of the one that handles unsigned long long int as follows:

#include <limits.h>  int unique_ull(unsigned long long int number) {     char seen[10] = {0};      while (number) {         int digit = number % 10;          number /= 10;         if (seen[digit]++)             return 0; /* not unique */      }      return 1; /* unique */  }  int unique_ll(long long int number) {     unsigned long long int n;      /* Represent original number as a 2's complement number. */     n = number;     if (n > LLONG_MAX) {         /*          * Original number was negative, so take its 2's complement to "negate" it.          * (Note: This works even when original number is LLONG_MIN.)          */         n = -n;     }     /* Handle as an unsigned long long int. */     return unique_ull(n);  } 

I suppose it would be useful to support intmax_t and uintmax_t in the same way:

#include <stdint.h>  int unique_um(uintmax_t number) {     char seen[10] = {0};      while (number) {         int digit = number % 10;          number /= 10;         if (seen[digit]++)             return 0; /* not unique */      }      return 1; /* unique */  }  int unique_m(intmax_t number) {     uintmax_t n;      /* Represent original number as a 2's complement number. */     n = number;     if (n > INTMAX_MAX) {         /*          * Original number was negative, so take its 2's complement to "negate" it.          * (Note: This works even when original number is INTMAX_MIN.)          */         n = -n;     }     /* Handle as a uintmax_t. */     return unique_um(n);  } 
</div
 
 
   
   
1
 
vote

私の5つのセント。:)

STERTERS機能のパラメータには、<コード> long long int (または<コード> intmax_t )が入力されるべきです。この場合、関数は任意の整数型のオブジェクトに適用できます。

これは実証プログラムです。

<事前> <コード> #include <stdio.h> int unique_digits( long long int n ) { const long long int Base = 10; int unique = 1; while ( unique && n ) { long long int digit = n % Base; long long int tmp = n /= Base; while (tmp && digit != tmp % Base ) tmp /= Base; unique = tmp == 0; } return unique; } int main(void) { int n = 12345678; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); n = 12345671; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); n = -12345678; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); n = -112345671; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); return 0; }

プログラム出力は

です <事前> <コード> 12345678: unique 12345671: non_unique -12345678: unique -112345671: non_unique

ヘッダを含める場合 <stdint.h> type long long int は、Type intmax_t を代入できます。

もう1つの方法は、数字の配列として整数を使用することです。これが実証プログラムです。

<事前> <コード> #include <stdio.h> int unique_digits( long long int n ) { const long long int Base = 10; unsigned short unique = 0; long long int digit; int offset; do { digit = n % Base; if ( digit < 0 ) digit = -digit; offset = 1 << digit; unique ^= offset; } while ( ( unique & offset ) && ( n /= Base ) ); return n == 0; } int main(void) { int n = 12345678; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); n = 12345671; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); n = -12345678; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); n = -112345671; printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" ); return 0; }

出力は前のプログラム

の出力と同じです。 <事前> <コード> 12345678: unique 12345671: non_unique -12345678: unique -112345671: non_unique
 

My five cents.:)

For starters the parameter of the function should have the type long long int (or intmax_t). In this case the function can be applied to objects of any signed integer type.

Here is a demonstrative program.

#include <stdio.h>  int unique_digits( long long int n ) {     const long long int Base = 10;      int unique = 1;      while ( unique && n )     {         long long int digit = n % Base;         long long int tmp = n /= Base;          while (tmp && digit != tmp % Base ) tmp /= Base;          unique = tmp == 0;     }      return unique; }  int main(void)  {     int n = 12345678;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      n = 12345671;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      n = -12345678;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      n = -112345671;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      return 0; } 

The program output is

12345678: unique 12345671: non_unique -12345678: unique -112345671: non_unique 

If to include the header <stdint.h> then the type long long int can be substituted for the type intmax_t.

Another approach is to use an integer as an array of digits. Here is a demonstrative program.

#include <stdio.h>  int unique_digits( long long int n ) {     const long long int Base = 10;      unsigned short unique = 0;      long long int digit;     int offset;      do     {         digit = n % Base;         if ( digit < 0 ) digit = -digit;          offset = 1 << digit;         unique ^= offset;     } while ( ( unique & offset ) && ( n /= Base )  );              return n == 0; }  int main(void)  {     int n = 12345678;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      n = 12345671;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      n = -12345678;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      n = -112345671;      printf( "%d: %s ", n, unique_digits( n ) ? "unique" : "non_unique" );      return 0; } 

It output is the same as of the previous program

12345678: unique 12345671: non_unique -12345678: unique -112345671: non_unique 
</div
 
 
0
 
vote

数値が一意の数字しかないかどうかを確認するためにSET STLを使用できます。たとえば、2020番号を検討してください。その後、数値を文字列に変換できます。

<事前> <コード> int num; cin>>num string s = to_string(num);

その後、文字列s の内容を持つセットを初期化します。

<事前> <コード> intmax_t0

それから私達は文字列s のサイズと新しく作成されたセット unitigits を比較することができます。

<事前> <コード> intmax_t1

セットの財産を知っているように、その setは一意の数字のみを保存し、繰り返しの数字を破棄してから、両方のサイズが等しい場合はすべての桁が一意です。 SETのサイズが文字列のサイズより小さい場合は、その番号に明確な数字が含まれず、すべての繰り返し数が破棄されます。

<事前> <コード> intmax_t2

ここでは、文字列のサイズは4、SETのサイズは2です。

 

You can use set STL in order to check if a number has only unique digits. For example, let us consider number 2020, then we can convert the number into the string,

int num; cin>>num string s = to_string(num); 

After that, initialise a set with the contents of string s.

set<int> uniDigits(s.begin(), s.end()); 

Then we can compare the size of string s and newly created set uniDigits.

if(s.size() == uniDigits.size()) { break; } 

As we know the property of sets, that set stores only unique numbers and discards repeated digits, then if both sizes are equal that means all digits are unique. If size of set is less than that of the string, that means the number does not contain distinct digits and all the repeated numbers are discarded.

#include <bits/stdc++.h> using namespace std;  int main() {     string s = "2020";     set<int> digits(s.begin(), s.end());     cout << s.size() << " " << digits.size() << endl;     return 0; } 

Here, the size of string is 4 and size of set is 2, because the string contains two repeated digits.

</div
 
 
-1
 
vote

これを達成するための1つのアプローチです

<事前> <コード> intmax_t3

静的配列の要素はデフォルト値0で初期化されていることに注意してください。

 

Here's one approach to achieve this

#include <stdio.h>  int main(){     int n, i, digit;     static int arr[10];     scanf("%d", &n);     while(n>0){         digit = n%10;         arr[digit]++;         n=n/10;     }     for(i=0; i<10; i++){         if(arr[i]>1){             printf("Not unique!");             break;         }     }     if(i==10){         printf("unique");     }     return 0; } 

Note that the elements of static array is initialized with the default value of 0.

</div
 
 

関連する質問

17  Realloc()で2重の空きエラーまたは破損エラーを獲得しているのはなぜですか。  ( Why am i getting a double free or corruption error with realloc ) 
C内の文字列置換関数を作成しようとしました。これは、 malloc() を使用して割り当てられている char * で機能します。スタート文字列内の文字ではなく文字列を見つけて置き換えることが少し異なります。 検索と置換文字列が同じ長さ(または置換文字列が検...

1  共用体クエリを使用してODBCソースから複数行を取得する  ( Retrieve multiple rows from an odbc source with a union query ) 
複数行をODBCソースからListViewコントロールに取得しています。 SIMPLE SELECTの場合は、SQL_SCROLLABLEのステートメント属性とうまく機能します。 Unionクエリ(2つの選択を含む)でこれを行うにはどうすればよいですか? 最も...

35  ANSI(C89 / 90)Cのバイトを表すために使用するタイプ?  ( Type to use to represent a byte in ansi c89 90 c ) 
ANSI(C89 / 90)Cのバイトを表す標準 - 不満の方法はありますか?私は、ほとんどの場合、Charがバイトであることを知っていますが、私の理解はこれが事件になることを保証されていないということです。また、C99規格にはSTDINT.Hがありますが、...

20  ロックボックスオーディオフォーマット  ( Rockbox audio format ) 
rb->pcm_play_data() のコールバックを指定しますか? ...

4  Galoisフィールド演算でy = x * xの最適化  ( Optimize y xx in galois field arithmetic ) 
GF(8)を超える乗算をするためのこのCコードを持っています(8): <事前> <コード> int32_t GaloisMultiply (int32_t a, int32_t b) { int32_t i; int32_t mask = ...

4  Cのテストフレームワーク[クローズ]  ( Testing frameworks for c ) 
現在立つにつれて、この質問は私たちのQ&AMPにとって良いフィットではありません。フォーマット。私たちは事実、参考文献、または専門知識によって支持されることを期待していますが、この質問は...

63  DLLによって公開されたすべての機能を見つける方法はありますか  ( Is there a way to find all the functions exposed by a dll ) 
DLLの関数名にマッピングするすべての文字列を取得する方法を検索しています。 私はあなたがgetProcaddressを呼び出すことができるこのすべての文字列によって意味します。シンボル(文字列)の16進数のダンプがある場合は、私がそれらの名前を取得するた...

36  GTK Messageboxの実装  ( Gtk implementation of messagebox ) 
GTKを使用してWin32の REPLACE INTO1 を実装しようとしています。アプリはsdl / openglを使用するので、これはGTKアプリではありません。 <コード> REPLACE INTO3 関数内の初期化( REPLACE INTO2 )...

13  静的イニシャライザ、つまりmain()の前にgetenv()を使用しても安全ですか?  ( Is it safe to use getenv in static initializers that is before main ) 
Stevens 、および POSIXプログラマーズガイド、そして私が見つけることができる最高のものです プロセスが開始されたときに Enviroment という文字列の配列が利用可能になります。 この配列は、外部変数<コード> environ によっ...

164  z / ONのC ++でC Socket APIを使用する方法  ( How to use the c socket api in c on z os ) 
z / OS上のC ++でC ++で正しく機能するようになる問題が発生しました。 sys/socket.h を含めていますが、 AF_INET が定義されていないことを伝えます。 私は明白なものを欠いているか、z / OSにいることに関連していることです...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有