質問

だから数が3で割り切れなし %, / または *.のヒントを与えられた使用 atoi() 機能です。あらゆるアイデアをどうするの?

役に立ちましたか?

解決

減算3時まで、あなたのいずれか

)0ヒット - 数が3で割り切れるた

b)は0以上の数を取得 - 数が割り切れる

はありませんでした

- 修正に編集されたバージョンは、問題を指摘

while n > 0:
    n -= 3
while n < 0:
    n += 3
return n == 0

他のヒント

現在の答え桁上のすべての焦点、適用するときに「すべての桁を追加し、その格差場合は3でご覧ください」。そのトリックは、実際には、同様の六角で動作します。例えば0x12には、0x1の+を0x2 = 0x3のため、3で除算することができます。そして、進に「変換する」小数に変換するよりもずっと簡単です。

擬似コード

int reduce(int i) {
  if (i > 0x10)
    return reduce((i >> 4) + (i & 0x0F)); // Reduces 0x102 to 0x12 to 0x3.
  else
   return i; // Done.
}
bool isDiv3(int i) {
  i = reduce(i);
  return i==0 || i==3 || i==6 || i==9 || i==0xC || i == 0xF;
}

[編集] R触発され、より高速なバージョン(OログログN)

int reduce(unsigned i) {
  if (i >= 6)
    return reduce((i >> 2) + (i & 0x03));
  else
   return i; // Done.
}
bool isDiv3(unsigned  i) {
  // Do a few big shifts first before recursing.
  i = (i >> 16) + (i & 0xFFFF);
  i = (i >> 8) + (i & 0xFF);
  i = (i >> 4) + (i & 0xF);
  // Because of additive overflow, it's possible that i > 0x10 here. No big deal.
  i = reduce(i);
  return i==0 || i==3;
}

桁に番号を分割します。一緒に数字を追加します。あなたが唯一の1桁左になるまで繰り返します。その数字は、3,6、または9である場合、数が3で割り切れる(そして特別な場合として0を処理することを忘れないでください)。

文字列に変換し、次いで一緒に小数点以下の桁を付加する技術がエレガントであるが、

は、それがいずれかの分割を必要とするか、変換対列ステップで非効率的です。進数に直接アイディアを適用する方法は、最初は小数点数の文字列に変換せずに、ありますか?

これは結局のところ、あります:

元の数が3で割り切れたときに限り進数、その奇数ビットの和マイナスその偶数ビットの和が3で割り切れる。

を考えます

の例としては:バイナリでは3で割り切れる数3726を取る、これは111010001110あります。我々は左に奇数桁、右から始まると移動し、取るので、[1、1、0、1、1、1];これらの合計は、5 ののです。偶数ビット[0、1、0、0、0、1]です。これらの合計は2 ののです。 5 - 2 = 3、我々は元の数が3で割り切れることを結論付けることができ、そこから

3によってA番号割り切れるが、IIRC、その桁の和が3で割り切れることに特徴を有している。例えば、

12 -> 1 + 2 = 3
144 -> 1 + 4 + 4 = 9

面接の質問質の確認を行うために以下には既に知られる)のdivisibility規則を簡略表現に3していdivisor.

のdivisibilityのルールが3以下

せ番号の追加と各桁に多くの注目を集めています。それが和やるかどうかを判断するためには、3で割り切れ(繰り返し同様の手続きに必要です。場合最後の数が3で割り切れ、その数が3で割り切れ.

例:

16,499,205,854,376
=> 1+6+4+9+9+2+0+5+8+5+4+3+7+6 sums to 69
=> 6 + 9 = 15 => 1 + 5 = 6, which is clearly divisible by 3.

参照

数xを考えます。 変換は、文字列にxは。文字による文字列の文字を解析します。各解析された文字は(atoi関数を使用して())数に変換して、新しい番号yにすべてのこれらの数字を追加します。 最終的な結果の数は長い一桁になるまで処理を繰り返します。その一桁のいずれか3,6または9である場合、origional数xが3で割り切れる。

Javaで私のソリューションは、32ビットで動作します。の符号なしintsます。

static boolean isDivisibleBy3(int n) {
  int x = n;
  x = (x >>> 16) + (x & 0xffff); // max 0x0001fffe
  x = (x >>> 8) + (x & 0x00ff); // max 0x02fd
  x = (x >>> 4) + (x & 0x000f); // max 0x003d (for 0x02ef)
  x = (x >>> 4) + (x & 0x000f); // max 0x0011 (for 0x002f)
  return ((011111111111 >> x) & 1) != 0;
}

は、最初に右にマスクを適切な回数をシフトすることによって未満32数まで割り切れるための最後のステップのチェックを数を減少させる。

あなたはこのCにタグを付けていなかったが、あなたはatoiを述べているので、私はC液与えるつもりです。

int isdiv3(int x)
{
    div_t d = div(x, 3);
    return !d.rem;
}
bool isDiv3(unsigned int n)
{
    unsigned int n_div_3 =
        n * (unsigned int) 0xaaaaaaab;
    return (n_div_3 < 0x55555556);//<=>n_div_3 <= 0x55555555

/*
because 3 * 0xaaaaaaab == 0x200000001 and
 (uint32_t) 0x200000001 == 1
*/
}

bool isDiv5(unsigned int n)
{
    unsigned int n_div_5 =
        i * (unsigned int) 0xcccccccd;
    return (n_div_5 < 0x33333334);//<=>n_div_5 <= 0x33333333

/*
because 5 * 0xcccccccd == 0x4 0000 0001 and
 (uint32_t) 0x400000001 == 1
*/
}
同じルールに続いて

、「N」で割り切れるテストの結果を得るために、私たちは次のことができます。                 0x1の0000 0000により乗算数 - (1 / N)*は0xFFFFFFFF                 比較(1 / N)* 0xFFFFFFFFの

の相手はいくつかの値のために、テストが7で割り切れると、例えば、テストにしたいすべての32ビットの数値のための正しい結果を返すことができないということです。

私たちが得た0x100000000-(1 / n)の*は0xFFFFFFFF = 0xDB6DB6DC そして7 * 0xDB6DB6DC = 0x6に0000 0004、 我々は唯一の値の四分の一をテストしますが、我々は確かにsubstractionsであることを避けることができます。

他の例:

11 * 0xE8BA2E8C = A0000 0004、値の四分の一

17 * 0xF0F0F0F1 = 10 0000 0000 1 0xF0F0F0Fと比較 すべての値が!

など、私たちも、それらの間の自然数を組み合わせることにより、すべての数字をテストすることができます。

数が追加数のすべての数字は、結果3を与えた場合、例えば3693 6または9 3 1 = 3 + 9 + 3 = 21と2 + 6 + 3などで割り切れる3で割り切れますそして3は3で割り切れるます。

inline bool divisible3(uint32_t x)  //inline is not a must, because latest compilers always optimize it as inline.
{
    //1431655765 = (2^32 - 1) / 3
    //2863311531 = (2^32) - 1431655765
    return x * 2863311531u <= 1431655765u;
}
いくつかのコンパイラでは、これはその後、さらに速く、通常の方法である:x % 3。よりここを読んでます。

あなたが入力番号のサブとして各桁を取得し、それらを追加することができように、番号の桁の全ての合計は3で割り切れる場合は、も数が3で割り切れます。唯一の一桁の結果があるまであなたは、このプロセスを繰り返します。

これは3,6または9である場合、

は数が3

によりdivisableあります
その数字の合計が、あなたが一桁に残っているまで、あなたは再帰的にこの定義を使用することができます3で割り切れるときに限り、数が3で割り切れます。結果は3,6または9である場合、元の数が3で割り切れるそれ以外の場合はありません。

Exaple:33333 => 15(+ 3 3 + 3 + 3 + 3)=> 6(1 + 5)3で割り切れる33333そう

を参照してください。整除ルール

数が3

で割り切れるかどうかをチェックするための

C#ソリューション

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 33;
            bool flag = false;

            while (true)
            {
                num = num - 7;
                if (num == 0)
                {
                    flag = true;
                    break;
                }
                else if (num < 0)
                {
                    break;
                }
                else
                {
                    flag = false;
                }
            }

            if (flag)
                Console.WriteLine("Divisible by 3");
            else
                Console.WriteLine("Not Divisible by 3");

            Console.ReadLine();

        }
    }
}
  • ここで疑似アルゴル来ました。

ましょう星の進捗状況倍の3

000 011
000 110

001 001
001 100
001 111

010 010
010 101


011 000
011 011
011 110

100 001
100 100
100 111

101 010
101 101

ってことなり、複数のバイナリの3 x=abcdef 以下のカップル abc=(000,011),(001,100),(010,101) cde doest変更することが私の提案している アルゴリズム:

divisible(x):

    y = x&7

    z = x>>3

    if number_of_bits(z)<4

        if z=000 or 011 or 110 , return (y==000 or 011 or 110) end

        if z=001 or 100 or 111 , return (y==001 or 100 or 111) end

        if z=010 or 101 , return (y==010 or 101) end

    end

    if divisible(z) , return (y==000 or 011 or 110) end

    if divisible(z-1) , return (y==001 or 100 or 111) end

    if divisible(z-2) , return (y==010 or 101) end

end

ここでは最適化した溶液とを熟知していることが必要です.................

ソース: http://www.geeksforgeeks.org/archives/511

#include<stdio.h>


int isMultiple(int n)
{
    int o_count = 0;
    int e_count = 0;


    if(n < 0)  
           n = -n;
    if(n == 0) 
           return 1;
    if(n == 1)
           return 0;

    while(n)
    {

        if(n & 1)
           o_count++;
        n = n>>1;


        if(n & 1)
            e_count++;
        n = n>>1;
    }

     return isMultiple(abs(o_count - e_count));
}


int main()
{
    int num = 23;
    if (isMultiple(num))
        printf("multiple of 3");
    else
        printf(" not multiple of 3");

    return 0;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top