• ベストアンサー

桁数を求めるプログラム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

  • 桁数を求めるプログラム。

    入力した数字の桁数を表示させるというプログラムを考えています。 例) 135 この数字の桁数は3桁です。 などと表示させたいと思っています。 それで、私は入力した数値を10で割っていって入力した数値aがa<=0になったらループを終了して 何回ループしたかのカウンタで桁数を表示させようかと考えました。 たとえば135→13.5→1.35→0.135で整数部分が0となるのでループを打ち切って 3回繰り返したので3桁と表示させたいと思いました。 それでプログラムを考えてみたのですが、どうにもうまくいきいません。 どのように修正したら桁数が表示できるようになるでしょうか? #include <stdio.h> main() { double a=0; int n=1; scanf("%d",&a); while(1) { a=a/10.0; if(a<=0){ break; } n++; } printf("その数は%d桁です。\n",n); }

  • プログラムが上手く動作しません。

    質問です。 1.整数を1個入力し、その数を3で割った余りが0ならば"Good morning"、1ならば"Good evening"、2ならば"Good afternoon"と出力するプログラムを作成せよ。ただしswhitc文を用いること。 という問題で私は #include <stdio.h> main() {      int a;      printf("整数a:");      scanf("%d",&a);      switch(a%3)      {      case '0':           printf("Good morning \n");           break;      case '1':           printf("Good evening \n");           break;      case '2':           printf("Good afternoon \n");           break;      } } と考えましたが実行しても入力はできますがprintfが表示されません。 どこが間違っているのでしょうか?ちゃんとコンパイルはできるのですが・・・。 2.10個の整数値をキー入力し、合計と平均値を計算してその結果を表示するプログラムを書きなさい。 #include <stdio.h> main() {      int a[11],b,c,i;      for(i=1;i<11;i++)      {           printf("整数%d:\n",i);           scanf("%d",&a[i]);      }      for(i=1;i<11;i++)           b+=a[i];      c=b/10;      printf("合計値は%d",b);      printf("平均値は%d",c); } というプログラムを考えましたが、計算結果がめちゃくちゃになってしまいます。 これもどこを直したらいいべきでしょうか?

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • このプログラムみてもらえますか?

    課題は標準入力から正整数aを読み込み、aが素数であるか否か判定するプログラムを作れ、です。 #include <stdio.h> int main(void) { int a,b,c; for(;;){ printf("正整数を入力して下さい。\n"); scanf("%d",&a); c=a%b; for(b=2;b=a-1;b=b+1){ if(c==0) printf("素数でない。\n"); break; } printf("素数です。\n"); break; return(0); } } コンパイルはできますが、実行すると9が「素数です」と表示されます^^; よろしくおねがいします。

  • scanf関数のプログラムをgetchar関数で

    scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }

  • おみくじプログラムですがじっこうできません。

    #include<stdio.h> int main() { int i; char data[5][10]={"大吉","小吉","吉","凶","大凶"}; printf("1~5の間の整数を入力:"); scanf("%d",&i); while(i<1&&i>5){ printf("入力値が不適切です。\n"); printf("1~5でお願いします。\n"); scanf("%d",&i); } printf("%s\n",data[5][i-1]); return 0; } 自分で考えてみたのですが、どうしたらいいかわかりません。

  • C言語の簡単なプログラム

    簡単な足し算のみの電卓をC言語で作っています。 /が入力されるまで足し算を繰り返すものです。 コンパイルをして、足し算を繰り返すところまでは上手くいったのですが、 /を入力してのループの抜け方がわかりません。 #include<stdio.h> int main(void) { int x=0,z; printf("数値を入力\n"); printf("終了は/を入力\n"); printf("\n結果 %d\n",x); while(1){ scanf("%d",&z); x=x+z; /* 足し算の計算 */ printf("結果 %d\n",x); /* 現在の計算結果を表示 */ } printf("終了 結果: %d\n",x); /* 計算の終了、合計値の表示 */ return 0; } while文のなかにifでいれればいいのでしょうか? その場合、 if(z=='/') break; でいいんでしょうか? if文以外のやり方がある場合も教えていただけたらと思います。 よろしくお願いします。

  • このプログラムの問題点を教えてください。

    いつもお世話になっております。 また質問させていただきます。 あるサイトの課題を自分なりにやってみました。 問題文 クイズを3題出題し、ユーザの解答に応える(「正解」とか「不正解」とか言う)プログラムを書いてください。   クイズは何でもかまいません。 それで作ってみたプログラムがこれです。 #include <stdio.h> int main(void){ int x,y; printf("1234\n"); scanf("%d",&x); switch(x){ case 0: return 0; case1: printf("hgfhgfhsa\n"); break; case2: printf("hjtuyer\n"); break; case3: printf("uytcbbvxbn\n"); break; case4: printf("oiu68fgfd\n"); break; } while(1){ printf("haydhgfsjd?\n"); printf("1,kukakaka 2,hihihi 3,yayay\n"); scanf("%d",&y); if(y == 1){ printf("763827648327ue\n"); break; } else if(y == 2){ printf("menndokusai\n"); break; } なんとかコンパイルができました。本当は3問問題を書かなければいけないのですが2問目が終わって確認の意味でコンパイルしました。 それで実行してみたところ、1問目の答えが出ませんでした。自分でも理由がわかりません。 なので皆様に問題点を指摘してほしいのです。 へんな質問ですがよろしくおねがいします。

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • 銀行のATMを想定したプログラム

    銀行のATMを想定したプログラム だいたい出来上がったのですが、 error C2143: 構文エラー : ';' が '型' の前にありません。 と出るのですがよくわかりません。 どこが違うのか指摘お願いします。 #include<stdio.h> void gamen();//メニュー画面を表示するユーザ関数をつくる。 int syori(int);//番号を入力した場合の処理はユーザ関数で作り、main関数から呼び出す。 int zandaka; int main(void) { int no,zandaka=100; printf("いらっしゃいませ\n"); do{ gamen(); scanf("%d",&no); int syori(int no); }while(no!=4); return 0; } void gamen() { printf("ご希望のメニューを入力してください\n" "1、お預け入れ\n" "2、残高照会\n" "3、おひきだし\n" "4、終了\n"); } int syori(int no) { int nuwkin,orosu; switch (no){ case 1:printf("お預入れ>"); scanf("%d",&nuwkin); zandaka=zandaka+nuwkin; printf("残高は%d円になります\n\n",zandaka); break; case 2:printf("残高は%d円です\n\n",zandaka); break; case 3:printf("おひきだし額は>"); scanf("%d",&orosu); if(orosu>zandaka){ printf("おひきだし額限度額は%dです" "残高不足なので引き出せません",zandaka); } else { if (zandaka>orosu){ zandaka=zandaka-orosu; printf("残高は%d円になりました",zandaka); } } break; case 4:printf("ありがとうございました\n\n"); break; default:("もう一度ご希望のメニューを入力\n"); } }

専門家に質問してみよう