int型より大きな型

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Steg

int型より大きな型

#1

投稿記事 by Steg » 9年前

初歩的な質問でもうしわけございません。ぜひご教授お願いします。
現在 Borland C++Compiler5.5 を使用しています。

typedef long long int ll;
としておくとエラーがでるので、int型より大きな変数を作れません。
(具体的には、フィボナッチ数列のFnから10^9+7で余りをとるので
)

Steg

Re: int型より大きな型

#2

投稿記事 by Steg » 9年前

すいません、途中で完了させてしまいました。

コード:

/*includeは略*/
using namespace std;

#define MAX 10000000000
#define LOOP(i,n) for(i = 0;i < n;i++)

typedef long long int LL;

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	return 0;
}
と記述すると、エラーで
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
a.cpp:
エラー E2176 a.cpp 21: 宣言に型が多すぎる
*** 1 errors in Compile ***

とあります。

プログラミングコンテストチャレンジブックなどである方法のように LL でint型より大きな整数を扱いたいのですが
どうすれば解決しますでしょうか。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: int型より大きな型

#3

投稿記事 by みけCAT » 9年前

__int64という型を使うとできるかもしれないです。
BCC32には64bit整数型ないのでしょうか? • C言語交流フォーラム ~ mixC++ ~
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: int型より大きな型

#4

投稿記事 by naohiro19 » 9年前

long long int型は「C99」以降で導入された型なので使えません。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: int型より大きな型

#5

投稿記事 by みけCAT » 9年前

Steg さんが書きました:具体的には、フィボナッチ数列のFnから10^9+7で余りをとるので
ちなみに、これは32ビット符号付き整数の範囲の計算でできます。(2^31-1 = 2147483647 > 2*(10^9+7))

F0 = 0, F1 = 1としています。

コード:

#include <stdio.h>

#define MOD_BY 1000000007

int add(int a, int b) {
	int r = a + b;
	if (r >= MOD_BY) r -= MOD_BY;
	return r;
}

int mul(int a, int b) {
	int r = 0;
	while (b > 0) {
		if (b % 2 != 0) r = add(r, a);
		a = add(a, a);
		b /= 2;
	}
	return r;
}

void mul_matrix(int out[2][2], int a[2][2], int b[2][2]) {
	int r[2][2];
	int i, j;
	for (i = 0; i < 2; i++) {
		for (j = 0; j < 2; j++) {
			r[i][j] = add(mul(a[i][0], b[0][j]), mul(a[i][1], b[1][j]));
		}
	}
	for (i = 0; i < 2; i++) {
		for (j = 0; j < 2; j++) {
			out[i][j] = r[i][j];
		}
	}
}

int main(void) {
	int n;
	while (scanf("%d", &n) == 1) {
		int Fn;
		if (n <= 0) {
			Fn = 0;
		} else {
			int a[2][2] = {{1, 1}, {1, 0}};
			int m[2][2] = {{1, 0}, {0, 1}};
			int b = n - 1;
			while (b > 0) {
				if (b % 2 != 0) mul_matrix(m, m, a);
				mul_matrix(a, a, a);
				b /= 2;
			}
			Fn = m[0][0]; /* m[0][0] * 1 + m[0][1] * 0 */
		}
		printf("%d\n", Fn);
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Steg

Re: int型より大きな型

#6

投稿記事 by Steg » 9年前

naohiro19 さんが書きました:long long int型は「C99」以降で導入された型なので使えません。
VisualStudioでは用いることができるのはそのあたりの違いなんですかね。ありがとうございました。
みけCAT さんが書きました:__int64という型を使うとできるかもしれないです。
BCC32には64bit整数型ないのでしょうか? • C言語交流フォーラム ~ mixC++ ~

コード:

using namespace std;

#define MAX 10000000000
#define LOOP(i,n) for(i = 0;i < n;i++)

typedef __int64  LL;

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	LL a=MAX;
	
	printf("%lld\n",a);
	
	return 0;
}
このようにコードを書き直してみた結果、無事コンパイルがとおりました。
ですが、出力に
1410065408
と明らかに桁溢れしています。
フォーマットは%lldではないということでしょうか?%ldでもありませんでした。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: int型より大きな型

#7

投稿記事 by みけCAT » 9年前

Steg さんが書きました:ですが、出力に
1410065408
と明らかに桁溢れしています。
MAXがint型と認識され、オーバーフローしているかもしれません。
int型の範囲のリテラルを__int64型にキャストし、それを用いた計算式でMAXを表現するといいかもしれません。

試したところ、書式の修正のみで出力が改善しました。
Steg さんが書きました:フォーマットは%lldではないということでしょうか?%ldでもありませんでした。
non さんが書きました:BCCではlong long型の書式指定子が、違うようです。
printf("%I64llu ",a[j]);
で、試してください。
今回はunsignedではないので、%I64lldでいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Steg

Re: int型より大きな型

#8

投稿記事 by Steg » 9年前

%I64lldの書式を使うと、期待していたMAXの値が表示されました。
大変ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る