ここから本文です

C言語の質問です

アバター

ID非公開さん

2019/6/403:08:49

C言語の質問です

めちゃくちゃ大きい数字を扱う場合どのようにすれば良いのでしょうか?
long型でも扱えないような大きな数字です

自分で調べた結果配列を使うのではないか?という結論に至ったのですが…

#include <stdio.h>

int main()
{
int a[]={5784,6457,5327};←本当はもっと大きな数で数字は適当です。
int b[2];
int c;
int x;

x=10000;

b[2]= a[2];
b[1]=a[1]*x;
b[0]=a[0]*x*x;

c=b[2]+b[1]+b[0];

printf(″%d″,c);

return 0;
}

このようなプログラムを頑張って作成したところ、オーバーフロー?したのかマイナスの値が出てきてしまいました

大きな数字を扱う場合どのようにプログラミングすればいいのでしょうか?

↓使ってるソフトやpcのスペックです
visual studio2017,C##,corei7,win10,メモリ8GB

補足反応が遅くなってしまい申し訳ありません
回答ありがとうございます
>long long型じゃダメなの?
40桁近い数の計算なのでlong longでも無理です…すみません

皆様の意見を聞いてGMPなどのライブラリを使おうと思い、使い方等をずっと調べていたのですが…
知らない単語や英語だらけでインストール方法すら分かっていないのが現状です
提出期限も迫っているので厚かましいお願いではありますが、ライブラリをvisual studioで使う方法をpc初心者にもわかるように教えていただけないでしょうか?

聞いてばかりですみません…よろしくお願いします

閲覧数:
153
回答数:
5

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

ikt********さん

2019/6/411:01:36

> 自分で調べた結果配列を使うのではないか?という結論に至ったのですが…

まぁ、やりたいことは、フンイキ(?)わかります。
書かれてるコードはおかしいですが、発想は
あってると思う、たぶん。

Cが提供してくれてる言語組み込みの数値型は、
みな扱える値範囲に制限があります。
それを超える数値を扱いたいならば、言語のしくみ
には頼れないので、自作する か、すでに自作して
くださってある他人コード(e.g. OSSライブラリ)を
使わせていただくか、どっちかです。
どうやって作るの? に興味あるなら
・多倍長整数
とか
・任意精度計算
とかのワードで、ネット検索してみるとよいです。
基本的には、あなたの直感(?)のように、
小学校で習った筆算と同じです。
Cならばなんらかの型の 配列 を使ってエミュレーション
するでしょう。

> オーバーフロー?したのかマイナスの値が出てきてしまいました

あなたが printf("%d" を相変わらず使ってる事自体、
おかしいです。
printf は "%d" といわれたら、引数は int 型 としか、見ません。
intでは表現しきれない数値型を配列使ってエミュレーション
してるのに、printf "%d" で印字はできると思うほうが、
おかしいです。

多倍長整数型を自作しようと思うなら、以下全部作らないといけません。
・ほしい演算子(+ - * / %)に相当する計算関数
# 使い慣れた演算子での計算は、少なくともCでは、できません。
・それを印字するための printf 相当関数

それ自作するのはかなり大変だし、普通はすでに存在する
ライブラリ使います。
C言語族だと、GMP とかです。
https://ja.wikipedia.org/wiki/GNU_Multi-Precision_Library


以下は、あなたの背景次第ですが。
1.
long long では足りないのか?
言語が提供する基本型のひとつ、たいていは64bit整数です。
これで足りるなら、これでやる。

2.
それでも足りないなら、実績あるライブラリを使う。
# 学習目的、自作することが目的だ、というなら
# 話は別ですが。

3.
他の言語じゃいけないの?

言語によっては、はじめから 多倍長整数 を
ネイティブにサポートしてくれます。
確か、ruby や python が、そうです。
int限界越えたら、勝手に多倍長に切り替えてくれ、
利用者プログラマには意識させない。
C言語族やJavaだと、これは望めず、なんらかの
ユーザ定義数値型 を別途使わざるを得ないんですが。

これがいちばん楽な解決策だと、私なら思いますけど。

  • ikt********さん

    2019/6/412:41:22

    GMP を Cから使うと、こんなカンジです。
    http://pyopyopyo.hatenablog.com/entry/20090303/p1

    カンタンな二項演算とかしかなければいいですが、
    演算子 記法が使えないので
    (a+b) / (c-d)
    みたいなことを全部関数呼び出しで書くのは、
    かなりつらいです。

    演算子オーバーロードが可なC++ならば、
    演算子記法のママでイケるので、ストレスないです。


    確信犯で 演算子オーバーロードはやんない と
    なってるJavaでも、同様につらいです。
    BigInteger のようなクラスは標準提供されてても、
    私はJavaで多倍長数値計算は、したくない。 めんどくさい。
    シバリがなければ他言語でいきます。

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

アバター

質問した人からのコメント

2019/6/7 10:45:15

自力で何とか頑張ってみます
回答ありがとうございました

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

uso********さん

2019/6/412:36:01

多倍長整数なら配列でn進数を表現する
という発想は合っています。10000進数
とかで四則演算自作するのも良いですが、
実用的には既存のモノを使うべきかと。
https://ja.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F%E7%B2%BE%E5%BA%A6%...
>win10
最新版なら、PowerShellのbigintを使う
のが四則演算&剰余べき乗程度なら一番
手っ取り早いかと。

[bigint]::Pow(2,100)
1..100|%{$a*=$_} -begin{$a=[bigint]1} -end{$a}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

yaf********さん

2019/6/410:58:12

doubleぢゃだめなの?

c=b[2]+b[1]+b[0];
配列にしたって結局intに代入したらオーバーフローするでしょw

最後まで配列でいきなさいよ

tes********さん

2019/6/410:38:48

long longかなぁ。

cha********さん

2019/6/403:39:38

BIGNUMというライブラリを使います。
openSSL でも使っています。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる