2017-12-22 14 views
0

以下のコードは、(intデータ型)では10桁まで細かく動作しますが、10桁を超える数値の場合は失敗してしまいましたので、私はunsigned long long intを試しました。しかし今、私の出力は15に固定されています、なぜidk?私は非常にCの新しい、私は平凡なpythonの背景があると思う!10桁を超える整数で演算した場合、Cの出力結果がぎこちないのはなぜですか?

私はあなたが間違った書式指定子を使用しているgccの(Ubuntuの5.4.0-6ubuntu1〜16.04.1)5.4.0 20160609

#include <stdio.h> //Get number of digits in a int 
unsigned long long int get_len(); 

void main() { 
    unsigned long long int num; 
    printf("Enter the number:"); 
    scanf("%d",&num); 
    printf("\nThe length of number is is: %d \n",get_len(num)); 
} 

unsigned long long int get_len(unsigned long long int z) { 
    unsigned long long int i = 1; 
    while (1) { 
     if ((z/10) > 1) { 
      //printf("Still greater than 1"); 
      i++; 
         z = z/10; 
      continue;} 
     else { 
      return(i+1); 
         break;}}} 
+0

あなたは[GMPlib](http://gmplib.org/のようないくつかの[BIGNUM](https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic)ライブラリをすることができ) –

+0

時間を節約し、すべてのコンパイラの警告を有効にします。 – chux

+1

Pythonは必要に応じて自動的にbignumに切り替わりますが、Cは「メタルに近い」ものであり、必要なときに任意のタイプの番号を昇格させることはできません。したがって、現代のコンパイラでは64ビットである 'unsigned long long int'で動作するようにコードを修正しても、*小数点以下20小数点を超えることはできません。 – usr2564301

答えて

8

を使用しています。それはscanf("%llu",&num);

scanfで間違った形式指定子を使用すると、未定義の動作です。

あなたの長さの発見のロジックは、1桁の数字と多項式の数字では失敗するという点で間違っています。

1の場合、数字の桁数は2で、他の数字も同様です。 (12の場合は3が返されます)。

数字が大きい場合は、ライブラリを選択するか(大きな番号の処理)、必要に応じて書き込むかを選択できます。

if(scanf("%llu",&num) != 1) { /* error */}のような番号をスキャンします。戻り値scanfをより明確に確認してください。

+0

神様、一桁の数字を試したことはありませんでしたが、失敗しました。私は訂正をします!それを指摘してくれてありがとう! –

2

これは別の実装です。これにより、いくつかの問題が修正されました:

  1. メイン戻り値の型はintである必要があります。
  2. unsigned intは、戻り値がget_len()以上で十分です。
  3. unsigned intおよびunsignedは同じである。また、unsigned long long intは、を除去することができます。
#include <stdio.h> 
unsigned get_len(); 

int main() 
{ 
    unsigned long long num; 

    printf("Enter the number: "); 
    scanf("%llu", &num); 

    printf("\nThe length of number is: %u\n", get_len(num)); 
} 

unsigned get_len(unsigned long long z) 
{ 
    return (z/10 > 0) ? get_len(z/10) + 1 : 1; 
} 
関連する問題