• ベストアンサー

数の大きさ

C++初心者です。以下の様なプログラムで、合計を求めたいのですが、あまり桁数の大きい数だと、正確な値がでません。(20桁とか・・・)これは一体どういうことが考えられますか?//配列の全要素の合計を求める #include<iostream.h> int main(void) { int i; int a[5]={0}.; cout<<"5個の整数値を入力しましょう。 \n"; for(i=0; i<5; i++) { cout<<"No."<<i+1<<": "; cin>>a[i]; } int sum=0; for(i=0; i<5; i++) sum=sum+a[i]; cout<<"合計は"<<sum<<"です。\n"; return(0); }

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

合計を求める為に使っている変数 sum の型 int は、表現できる数値の 範囲が決っています。 使っている環境のマニュアルか、もしくは include/limits.h に 記述があるはずですが、int が4バイトであれば、最大の数値は 2147483647 です。 もし、20桁の数値を正確に計算したい、ということであれば、 「多倍長演算」という技術を使います。 C++ でも良いのであれば、それをサポートしたクラスが、探せば いくつでも見つかるでしょう。そのうちのひとつを参考URLに 紹介しておきます。

参考URL:
http://hp.vector.co.jp/authors/VA007799/bignum.htm
yabupiano
質問者

お礼

なんとなく仕組みがわかってきました。ありがとうございます。 返事おそくなってすみません。

その他の回答 (1)

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

intの有効桁数を調べましょう。

yabupiano
質問者

お礼

調べてみます。ありがとうございました。

関連するQ&A

  • 合計値を求める関数

    #include<iostream> using namespace std; //sum関数の定義 int sum(int x, int y) { return x + y;  } int main() { int num1, num2, ans; cout << "1番目の整数を入力して下さい。\n"; cin >> num1; cout << "2番目の整数値を入力して下さい。\n"; cin >> num2; ans = sum(num1, num2); cout << "合計は" << ans << "です。\n"; return 0; }  ここのreturn x+y;の所の合計値を戻り値として返す処理の仕組みを解りやすく教えて欲しいです、戻り値はちょっと解りづらいです、よろしくお願いします。

  • 配列のプログラムですが

    #include <iostream> using namespace std; int main() { int a[100],b=-9999; int i=0,j; do { cout << "整数値を入力してください\n"; cin >> a[i]; b += a[i]; i++; }while( a[i-1] != 9999); cout << b << '\n'; for(j=0;j<i-1;j=j+1) cout << a[j] * 3 << '\n'; return 0; } このプログラムってどんな計算をしてるんですか?誰か分かる人いますか 整数値を入れてくださいって出るだけなんですが

  • C++ 

    このプログラムの最後に入力した数の合計を表示するには、どのようなプログラムを書き込めばいいでしょうか。 #include<iostream.h> void main(void) { int i=1,sum=0,num; while(num>=0) { cout<<"\n数値を入力してください(終了するときは負の数を入力):"; cin>>num; ++i; sum+=i; cout<<"1から"<<i<<"までたすと"<<sum<<"です"; } }

  • アドバイスください。

    10個の1桁の整数を入力して、入力した順番に並べたいのですが 最後の出力のところで番地が表示されてしまいます。 どうしてでしょうか? #include<iostream> using namespace std; int main(void){ int a; int b[10]; for(int i=0; i<9; i++){ cin >> a; b[i]=a; } cout << b; return 0; }

  • このプログラムにアドバイスをください

    問題が  ・100個の要素を持った一次元配列をmain()関数内で宣言 ・一次元配列と要素数を引数として持つ関数seisei() ・関数seisei()は乱数を使い渡された配列を0~99の整数で初期化する。 ・一次元配列、要素数そして変数のポインタを引数としてもつ関数goukei() ・関数goukei()は渡された配列に格納された数値の合計を計算し、渡された変数のポインタにその合計値を代入する。 と問題があり、下記のようにプログラムを作ったんですが、どうしてもコンパイルできません。どなたかご指摘よろしくお願いします。 #include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",&sum); return 0; } void seisei(int *a[i], int n) { srand(time(NULL)); for(i = 0; i <= n; i++){ *a[i] = rand() % 100; } } void goukei(int *a[i],int n,int *sum) { *sum = 0; for(i = 0; i <= n; i++){ *sum += *a[i]; } }

  • n進数を10進数に変換するプログラムがわかりません

    整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム 関数void base2dec(int n, string digits, int &dec)を使用する 実行例 110101(2)=53 123(8)=83 7ACE(16)=31438 以下はとりあえずつくったみたプログラムです #include<iostream> #include<string> using namespace std; void base2dec(int n, string digits, int &dec) { int i,x=0; for(i=0; i=digits.size()-1; i++) { if(n<10) { x=digits[i]-'0'; } else { x=digits[i]-'A'+10; } dec=(x*n); if(cin >> digits[i++]) { if(n<10) { dec=dec+(digits[i++]-'0'); } else { dec=dec+(digits[i++]-'A'+10); } } } int value = dec; } int main() { int n,value; string digits; cout << "何進数ですか-->"; cin >>n; cout << "数字列を入力してください-->"; cin >>digits;; base2dec(n,digits,value); cout << digits << "(" << n << ")=" << value << endl; return 0; } void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。ちなみにn進数から10進数に直す方法は理解しています。

  • C++で10進数→2進数に

    C++で10進数を2進数に変換するプログラムを 順番通りに表示できるようにする っていうのを配列を使って作るんですが 下はあまり関係ないですが、こんな感じのが参考になるかなと思ったんですが、どうすればいいんですか #include <iostream> using namespace std; int main() { int i,goukei=0; int kokugo[5]; float heikin; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績を入力してください\n"; cin >> kokugo[i]; goukei = goukei + kokugo[i]; } heikin = (float)goukei/5.0; cout << "平均点は" << heikin << "点です\n"; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績は" << kokugo[i]; cout << "点で、平均との差は" << heikin-(float)kokugo[i] << "です\n"; } return 0; }

  • C++での、素数の表を作成するプログラムについての質問です。

    C++での、素数の表を作成するプログラムについての質問です。 配列を使用して、2~71までの素数を表に埋め込みたいのです。 プログラム本体はここまで出来ているのですが、 素数を求める計算の方法がイマイチわかりません。 #include<iostream> #include <iomanip> using namespace std; #define N 20 int main() { int arry[N]; /********************************* ここでforを用いた反復で計算を行う **********************************/ /********************* 配列変数の内容を出力 *********************/ for(int i=0;i<N;i++) cout << "+--" ; cout << "+\n" ; for(int i = 0; i < N; i++ ) cout << "|" << setw(2) << arry[i] ; cout << "|\n" ; for(int i = 0; i < N; i++ ) cout << "+--" ; cout << "+\n" ; return 0; } for文を使用した反復構造でarry[N]に2~71までの数字をいれていきたいです。 お願いします。 なお、 int arry[N]={2,3,5,7…} や arry[0]=2; arry[1]=3; arry[2]=5; …のように入力してはいけないのです。

  • 素数

    Limit以下の素数をすべて表すプログラムなんですが実行した結果 ________________________________ Input Upper Limit:11 s[0]=3 s[1]=5 s[2]=5 s[3]=5 s[4]=7 s[5]=7 s[6]=7 s[7]=7 s[8]=7 s[9]=9 となるんですが s[0]=3 s[1]=5 s[2]=7 s[3]=9 にしたいですがどうすればいいのでしょうか? 教えてください。 ________________________________ #include<iostream> using namespace std; int main(void) { int Limit; int i,j,n; int s[256]; n=0; cout<<"Input Upper Limit:"; cin>>Limit; for(i=1;i<Limit;i++) { for(j=2;j<i;j++) { if(i%j==0) break; s[n]=i; cout<<"s["<<n<<"]="<<s[n]<<"\n"; n++; } } return 0; }

  • c++ 整数値の各桁を足し合わせるプログラム

    上記の通りの質問です #include <iostream> using namespace std; int main () { int x; int sum = 0; cout << "正の整数値の各桁を足す。\n " ; do{ cout << "正の整数値:"; cin >> x; }while (x <= 0); cout << "足すと"; while (x > 0){ cout << sum += x % 10; x /= 10; return sum; } cout << "です。\n " ; } とまでは書けましたがうまくいきません。 初心者なので簡単かもしれませんがお願いします。