桁数を求めるプログラム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桁とかになってしまいます。
その原因はどこにあるのでしょうか?
回答(5件)
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示
反則かもしれませんが、文字列を取り込んで strlenってのではだめですかね。
char a[256]; scanf ("%s", a); printf ("%d桁\n", strlen(a));
これなら255桁まで...
この回答へのお礼
回答ありがとうございました。
なるほど。確かにそうですね。
しかし問題が「正の整数値を読み込んで・・・」なので
ちょっとだめかもしれません。
でもその方法が一番手っ取り早いですね~。
No.4ベストアンサー10pt
32ビットCPUのint型は通常4バイト(32ビット)で、long型と同じです。
この型の整数は、ほぼ -2x10-9~+2x10^9 までの値しかとりませんので
10桁までしか無理なんです。
http://aspil.hp.infoseek.co.jp/Programming/c06.htm
10^10以上を表現できる数値型を用いなければいけませんが、
実数型の場合は、桁数は求められても精度は出なくなります。
この回答へのお礼
回答ありがとうござます。
あまりそういう事を考えたことがありませんでした。
参考になります。
double 型を使ってもいいのなら,
int n = log10(a) + 1;
と一発で求まる方法もあります。
ただ,
浮動小数点演算を使うとどうしても誤差が出て来ます。
極端な話 10.0 / 10.0 が 1 にならない *かも* しれません。
その点は気をつけてください。
この回答へのお礼
回答ありがとうございます。
誤差の問題は難しいですね。
No.2ベストアンサー20pt
#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にすればいいんですね。
ありがとうございました。
int a がオーバフローを起こしていると思います。
2の31乗で10桁位になりますから。
long intにしてもだめですかね。
この回答へのお礼
回答ありがとうございます。
long intにしてもだめでした。
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示











