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 回答 (2件)

合計を求める為に使っている変数 sum の型 int は、表現できる数値の


範囲が決っています。

使っている環境のマニュアルか、もしくは include/limits.h に
記述があるはずですが、int が4バイトであれば、最大の数値は
2147483647 です。

もし、20桁の数値を正確に計算したい、ということであれば、
「多倍長演算」という技術を使います。

C++ でも良いのであれば、それをサポートしたクラスが、探せば
いくつでも見つかるでしょう。そのうちのひとつを参考URLに
紹介しておきます。

参考URL:http://hp.vector.co.jp/authors/VA007799/bignum.htm
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/06/13 22:47

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2001/06/06 17:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q小学生算数 「上から2けた」の考え方

小学生算数 「上から2けた」の考え方

お世話になります。
数学のカテゴリで恐縮ですが、小学生の子供に算数を教えていてわからなかったので教えてください。
答えを上から2けたのおよその数で答えなさい、というときに、計算結果が0.536になった場合は、小数第1位を上から1けた目と考えて、小数第3位の6を四捨五入して0.54とすればよいのでしょうか?
1のくらいの「0」を1けた目と数えていいのかどうか、わからなくて質問させていただきました。よろしくお願いいたします。

Aベストアンサー

小数の場合、「上から?桁」はゼロを無視して数えます。

例)0.00829の上から2桁の概数 → 0.0083

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q小学生の算数問題です

子どもが塾で出された課題です。
「0から9までの数字を1回づつ使用して、4けた+2けた=4けたの式が成り立つものをすべたあげなさい。」
4通りは発見できたのですが、はたして全部で何通りあるかもわかりません。
どなたか助けて下さい。

Aベストアンサー

ABCD+EF=GHIJ とすれば、
B=9
H=0
A+1=G

また、各桁の偶奇を調べると、
偶+偶=偶、偶+奇=奇、奇+奇=偶
なので、繰り上がりを考えないと、奇数の数は偶数個でなければなりません。
0~9のうち奇数は5個なので、繰り上がりしている桁は奇数個あることになります。
2桁目、3桁目は繰り上がりしているので、1桁目も繰り上がりしています。

以上のことを踏まえて、
CとE、DとFは交換しても和は同じなので、C>E、D>Fとして、
2桁目の組み合わせを調べると、
A92D+8F=G01J (3,4,5,6,7)
A93D+7F=G01J (2,4,5,6,8)
A93D+8F=G02J (1,4,5,6,7)
A94D+6F=G01J (2,3,5,7,8)
A94D+7F=G02J (1,3,5,6,8)
A94D+8F=G03J (1,2,5,6,7)
A95D+6F=G02J (1,3,4,7,8)
A95D+7F=G03J (1,2,4,6,8)
A95D+8F=G04J (1,2,3,6,7)
A96D+7F=G04J (1,2,3,5,8)
A96D+8F=G05J (1,2,3,4,7)
A97D+8F=G06J (1,2,3,4,5)
の12通り。(括弧内は残りの数字)

さらにそれぞれの組み合わせを調べると、

4926+87=5013
5934+78=6012
5934+87=6021
2947+68=3015
5943+78=6021
1956+78=2034
1956+87=2043
1965+78=2043
2964+87=3051
の9通り。

1桁目、2桁目を交換したものも加えると、合計36通りとなります。

ABCD+EF=GHIJ とすれば、
B=9
H=0
A+1=G

また、各桁の偶奇を調べると、
偶+偶=偶、偶+奇=奇、奇+奇=偶
なので、繰り上がりを考えないと、奇数の数は偶数個でなければなりません。
0~9のうち奇数は5個なので、繰り上がりしている桁は奇数個あることになります。
2桁目、3桁目は繰り上がりしているので、1桁目も繰り上がりしています。

以上のことを踏まえて、
CとE、DとFは交換しても和は同じなので、C>E、D>Fとして、
2桁目の組み合わせを調べると、
A92D+8F=G01J (3,4,5,6,7)
A93D+7F=G01J...続きを読む

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

Q小5算数パズルの宿題が解りません。

1から9までの数字を1回ずつ使用し、5けたひく4けたの筆算式を2つ作り、
それぞれの答えが22222と33333になる筆算式を作ります。

     □□□□□
   -  □□□□
     2 2 2 2 2

     □□□□□
   -  □□□□
     3 3 3 3 3 

どうしても解けません。助けてください。

 

Aベストアンサー

回答例です。

31874
9652
22222

41286
7953
33333

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q小3の算数


1.2.3.4.5.6
1~6までのカードが1まいづつあります。
このカードを使って、
(3けた)-(3けた)の式を作りなさい。
Q1答えが111になる式はなんでしょうか?
 (111になるようにしましょう 答えは6パターンあります)
Q2答えが一番小さくなるのは?


よろしくお願いします。

Aベストアンサー

1
246-135 264-153 426-315 462-351 624-513 642-531
隣り合う数字を引けば1になることに気づく。それをうまくならべる方法。パターンをもれなく数え上げるコツ。こんなところを学ぶ問題でしょうか。

2
ほんとはマイナスの数字がいちばん小さいですが、小3ですからそれは考えないんでしょう。だとすると、

100の位は隣り合う数にすべきだというのをまず思いつく。
で、残りの10の位と1の位の数字で、できるだけ、引かれる方を小さく、引く方を大きくするのがいいなと考えるんでしょう。
そうすると65がいちばんでかくて、12がいちばん小さい。のこりの3と4で100の位を作ろう。

みたいな感じでしょうか。
412-365

Qint nII[10] = { 0 }について

久々にCを使ってプログラムを組んでいるのですが、基本的な構文を思い出せず
いくつか教えていただきたく質問させていただきました。

1)配列すべてを初期化するのに、宣言時に

int nII[10] = { 0 };

で大丈夫だった(全ての要素が0で初期化)と記憶しているのですが、間違いないでしょうか?

2)構造体の初期化は

struct tm tm;
memset(&tm, 0, sizeof(struct tm))

で大丈夫でしょうか?

3)構造体の宣言は

typedef struct{
int a;
}HOGE, *LPHOGE;

HOGE st; // <- struct HOGE stと同じ
LPHOGE pst; // <- struct HOGE* pstと同じ

で問題ないでしょうか?

以上、3つ質問になって申し訳ないのですが、よろしくお願いします。

Aベストアンサー

1)OK
2)たぶんOK
3)HOGEという名前の構造体はない(当該の構造体には名前がない)ので、
// 以下のコメント記述が誤っています。ただし、

HOGE st;
LPHOGE pst;
という定義そのものはOK

QACCESSで10桁の中から中の3桁を抜き出す関数

ACCESSで7けたの数値7654321から765の部分3桁と43の部分の2桁、21の桁を分けて抜きとりたいのですが、どういう関数を使ったらよいかわかりません、LEFT関数を使ってみたりしたのですがどうも欲しいものが取り出せないので基礎的なことですが教えてください
よろしくおねがいします

Aベストアンサー

クエリのデザイングリッドの「フィールド」のセルに

a: [x] \ 10000
b: ([x] Mod 10000) \ 100
c: [x]-[a]*10000-[b]*100

と入力してください。ここで、x は 7654321 などが入っているフィールドの名前、a, b, c は計算結果が入るフィールドの名前です。

7654321 に対しては、a に 765、b に 43、c に 21 が得られます。

Qint i, int i[1];

C++で、
 int i;
と、
 int i[1];
は、どっちで宣言をしても、iは同じ振るまいですか?

Aベストアンサー

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。
代入式の右に配置可能な値を右辺値といいます。

代入式の左に配置出来るのは『領域』です。
変数であっても良いし、配列要素でもかまいません。
また、領域を示す式(int i[1]のときの*iなど)でもかまいません。
配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。
代入式の左に配置可能な領域を左辺値といいます。

int i[1] ;
この形で宣言されたiは右辺値に利用できます。
int *a ;
a = i ;
しかし、iだけでは領域を持たないため左辺値になりえません。
i = 1 ; //コンパイルエラーが出る。

コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。

どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。
頑張って勉強してください。

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス...続きを読む


人気Q&Aランキング

おすすめ情報