新しく質問する

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

役に立った:1件
  • 質問者:usui323
  • 投稿日時:2003/10/15 21:28
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

すいません。疑問解決と思ったのですがまた新たな疑問が浮上してきました。

#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桁とかになってしまいます。

その原因はどこにあるのでしょうか?

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)
  • 参考になった:0件
  • 回答者:yatokesa
  • 回答日時:2003/10/15 23:45

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

通報する

この回答へのお礼

回答ありがとうございました。

なるほど。確かにそうですね。
しかし問題が「正の整数値を読み込んで・・・」なので
ちょっとだめかもしれません。

でもその方法が一番手っ取り早いですね~。

  • 参考になった:0件

No.4ベストアンサー10pt

  • 回答者:MovingWalk
  • 回答日時:2003/10/15 22:42

32ビットCPUのint型は通常4バイト(32ビット)で、long型と同じです。
この型の整数は、ほぼ -2x10-9~+2x10^9 までの値しかとりませんので
10桁までしか無理なんです。
http://aspil.hp.infoseek.co.jp/Programming/c06.htm

10^10以上を表現できる数値型を用いなければいけませんが、
実数型の場合は、桁数は求められても精度は出なくなります。

通報する

この回答へのお礼

回答ありがとうござます。

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

  • 参考になった:0件
  • 回答者:noname#5537
  • 回答日時:2003/10/15 22:21

double 型を使ってもいいのなら,
 int n = log10(a) + 1;
と一発で求まる方法もあります。

ただ,
浮動小数点演算を使うとどうしても誤差が出て来ます。
極端な話 10.0 / 10.0 が 1 にならない *かも* しれません。
その点は気をつけてください。

通報する

この回答へのお礼

回答ありがとうございます。

誤差の問題は難しいですね。

  • 参考になった:0件

No.2ベストアンサー20pt

  • 回答者:tyuuya
  • 回答日時:2003/10/15 21:55

#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 で確認しました。

通報する

この回答へのお礼

回答ありがとうございました。

なるほど!
aをdoubleにして%lfにすればいいんですね。

ありがとうございました。

  • 参考になった:0件
  • 回答者:ymmasayan
  • 回答日時:2003/10/15 21:44

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

通報する

この回答へのお礼

回答ありがとうございます。

long intにしてもだめでした。

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ

Facebook公式ページ

公式Twitter