Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

桁数を求めるプログラム2

すいません。疑問解決と思ったのですがまた新たな疑問が浮上してきました。 #include <stdio.h> main() { int a=0; int n=1; scanf("%d",&a); while(1) { a=a/10; if(a<1){ break; } n++; } printf("その数は%d桁です。\n",n); } のプログラムで10桁まではうまく表示できるようになったのですが、11桁以上が表示できません。 10桁以上を入力してもなぜか1桁とか10桁とかになってしまいます。 その原因はどこにあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tyuuya
  • ベストアンサー率50% (1/2)
回答No.2

#include <stdio.h> int main() { double a=0.0; int n=1; scanf("%lf",&a); while(a >= 1.0) { a = a / 10.0; n++; } printf("その数は%d桁です。\n",n-1); return 0; } ----------------------------------------------- これで。 一応Microsoft Visual C++ 6.0 で確認しました。

usui323
質問者

お礼

回答ありがとうございました。 なるほど! aをdoubleにして%lfにすればいいんですね。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.5

反則かもしれませんが、文字列を取り込んで strlenってのではだめですかね。 char a[256]; scanf ("%s", a); printf ("%d桁\n", strlen(a)); これなら255桁まで...

usui323
質問者

お礼

回答ありがとうございました。 なるほど。確かにそうですね。 しかし問題が「正の整数値を読み込んで・・・」なので ちょっとだめかもしれません。 でもその方法が一番手っ取り早いですね~。

すると、全ての回答が全文表示されます。
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.4

32ビットCPUのint型は通常4バイト(32ビット)で、long型と同じです。 この型の整数は、ほぼ -2x10-9~+2x10^9 までの値しかとりませんので 10桁までしか無理なんです。 http://aspil.hp.infoseek.co.jp/Programming/c06.htm 10^10以上を表現できる数値型を用いなければいけませんが、 実数型の場合は、桁数は求められても精度は出なくなります。

参考URL:
http://aspil.hp.infoseek.co.jp/Programming/c06.htm
usui323
質問者

お礼

回答ありがとうござます。 あまりそういう事を考えたことがありませんでした。 参考になります。

すると、全ての回答が全文表示されます。
noname#5537
noname#5537
回答No.3

double 型を使ってもいいのなら,  int n = log10(a) + 1; と一発で求まる方法もあります。 ただ, 浮動小数点演算を使うとどうしても誤差が出て来ます。 極端な話 10.0 / 10.0 が 1 にならない *かも* しれません。 その点は気をつけてください。

usui323
質問者

お礼

回答ありがとうございます。 誤差の問題は難しいですね。

すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

int a がオーバフローを起こしていると思います。 2の31乗で10桁位になりますから。 long intにしてもだめですかね。

usui323
質問者

お礼

回答ありがとうございます。 long intにしてもだめでした。

すると、全ての回答が全文表示されます。

関連するQ&A