2016-03-31 9 views
-2

ユーザに1つの数字を入力するように要求するCコードを作成する必要があり、そのコードがその数字が「Cullen's number」であるかどうかをチェックします。「Cullen's number」を見つけるCコード

「2^n * n + 1」で計算できるのは、カレン数です。カレンの数字の

例:

3=2^1 * 1 + 1 
9=2^2 * 2 + 1 
25=2^3 * 3 + 1 

ここで私は任意のヘルプ、に取り組んでいたコードですか?

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 

int main(void) 

{ 

    int num, brojP, potency = 0, numRepeats = 0, endResult=0, isCullen; 

    printf("Unesite broj"); 
    scanf("%d", &num); 

    do 
    { 

     potency = potency + 1; // initializing "potency" and at the same time making it one number larger at each repeat of the loop 
     do 
     { 
      brojP = 2*potency; 
      numRepeats = numRepeats + 1; 
     } while (numRepeats < potency); // this entire loop is used for "2^n" part 

     endResult = brojP * potency + 1; // calculate the "2^n * n + 1" 
     numRepeats = 0; 

     if (endResult == num) 
     { 
      isCullen = 1; 
      break; 
     } 


    } while (endResult < num); 

    if (isCullen == 1) 
     printf("Number inputted is Cullen's number\n"); 
    else 
     printf("Number inputted isn't Cullen't number\n"); 

    return 0; 


} 
+0

初期化されていない変数があるため、未定義の動作*があります。初期化されていないローカル変数は不確定*値を持ちます。 –

+0

あなたのループは '2^n'を計算するはずです。 'brojP'をループのたびに同じものに設定するので、' brojP = 2 * potency; 'を実行するのと同じです。 – Barmar

答えて

1

このループが間違っている:

do 
    { 
     brojP = 2*potency; 
     numRepeats = numRepeats + 1; 
    } while (numRepeats < potency); // this entire loop is used for "2^n" part 

あなたは2で前回の反復からのたびに結果を乗算する必要がありますが、あなたの代わりに2によってpotencyを乗算しています。 potencyは変更されないので、同じ割り当てを何度も繰り返しています。これは次のようになります:

brojP = 1; 
    for (numRepeats = 0; numRepeats < potency; numRepeats++) { 
     brojP *= 2; 
    } 
0

二分探索を使用すると、より効率的です。結果をintに格納すると、入力された数値の最大サイズは2^32(intは32ビットで最も頻繁にコーディングされます)と仮定します。 効力= 16で試してみると、入力した数字が2^24などで大きくなった場合 n = 6、n = 7を試してみて、どれも動作していない場合は、カレンの数字ではありません。 最大でlog2(32)= 5回計算します。

EDIT:ところで、なぜmath.hライブラリを使用しないのですか?

関連する問題