2013-07-02 6 views
8

こんにちは、ここではAdobeインタビューで質問されたQです。3で終わる数字は、すべて1を持つ複数の倍数を持っています

Numbers ending in 3 have at least one multiple having all ones. 
for eg., 3 and 13 have amultiples like 111 and 111111 respectively. Given such 
a no. , find the smallest such multiple of that number. The multiple can 
exceed the range of int, long. You cannot use any complex data structure. 

あなたが効率的なソリューションで

+0

だから、あなたは正確に何が必要なのでしょうか? – felknight

+0

説明解答[ここ](http://stackoverflow.com/a/7130063)。 – TheHappySloth

+0

[Cのアルゴリズム - 数字で演奏する - 3単位の場所で演奏する]の可能な複製(https://stackoverflow.com/questions/7129855/algorithm-in-c-playing-with-numbers-number-with-3 -in-units-place) – roottraveller

答えて

14

を私に提供することはできますが、今答えを得た:)ここ

int count=1, rem=1; 
while(rem) 
{ 
rem= (rem*10+1)%n; count++; 
} 
while(count--){ cout<<"1";} 
+4

あなたは、倍数が整数範囲を超えている可能性があると言ったばかりです。 – Aravind

+0

@HighPerformanceMarkこの質問は、整数または長整数を除外するものではありません。複雑なデータ構造の使用を除外します。モジュラ算術と 'x mod 3 'と'(x * 10 + 1)mod 3'の関係を観察して、実際にこのような倍数を計算せずに適切な倍数を表す文字列を計算することを排除するものではありません。 – twalberg

+0

@Aravindはいそれは回数であり、回数は1であり、複数のループではその数が印刷されているのです。 – Euler

2

は1、11、111、111をしようとしていることをより効率的にそれを行うための試みであります..これは報われるだろうか?一度に数字を1つ試すよりも、よりエレガントな答えがありますか?

1、11、111、...を(10^k - 1)/ 9と書くと、除算は正確であることが分かります。 10x + 3という形式のターゲット番号が与えられたとき、最小のk(10^k - 1)/ 9 = Y(10x + 3)を求めたい。ここでYは整数である。 10^k = 1 mod 9(10x + 3)の小さな解を探します。算術モジュ9(10x + 3)が必ずしもグループを形成するわけではないことを除いて、これはhttp://en.wikipedia.org/wiki/Discrete_logarithmですが、http://en.wikipedia.org/wiki/Baby-step_giant-stepアルゴリズムが適用され、kの値を一度に1つずつ検索するのではなく、 。出力サイズとは無関係に

+0

私はこれが実際の解決策ではないと思います。しかし、ちょうど1,11,111などを試すより効率的であることを理解したかったのですか?私たちはkを増やしながら、繰り返しごとに10^k mod A(A = 9(10x + 3)と仮定)を計算していますか? 10^kを格納する変数がオーバーフローし、その結果が非常に大きい場合はどうでしょうか?インタビュアーが一致するプロパティを使用することが期待される最適な方法ですか? - おかげさま。私はちょうど興味があります。 –

+0

必要な計算はmod 9(10x + 3)です。これがオーバーフローすると、複数の精度に切り替わらない限り運が悪くなりますが、10^kオーバーフロー後しばらく時間がかかることがあります。効率は、赤ちゃんステップ/巨大ステップアルゴリズムにより、N個の可能性の時間範囲をO(sqrt(N))で検索できるようになります。 – mcdowella

0
#include <iostream> 
using namespace std; 

int main() { 
    int t; 
    cin>>t; 
    while(t--){ 
     long long n; 
     cin>>n; 
     long long cur = 1; 
     while(cur%n!=0){ 
      cur = cur*10+1; 
     } 
     cout<<cur<<endl; 
    } 
    return 0; 
} 
+0

'long long'を使用して' intの範囲を超えるようにする '長いです。 _how_他の解決策は、与えられた数よりもはるかに多くの数を必要としないことを理解しようとしましたか? – greybeard

0

ソリューション:

public String ones(int n) 
{ 
    int i, m = 1; 
    String num="1"; 

    for (i = 1; i <= n; i++) { 
       if (m == 0) 
       return num; 
      /* Solution found */ 
      num=num+"1"; 
      m = (10*m + 1) % n; 
    } 
    return null; /* No solution */ 

}

関連する問題