初歩的な質問でもうしわけございません。ぜひご教授お願いします。
現在 Borland C++Compiler5.5 を使用しています。
typedef long long int ll;
としておくとエラーがでるので、int型より大きな変数を作れません。
(具体的には、フィボナッチ数列のFnから10^9+7で余りをとるので
)
int型より大きな型
Re: int型より大きな型
すいません、途中で完了させてしまいました。
と記述すると、エラーで
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
a.cpp:
エラー E2176 a.cpp 21: 宣言に型が多すぎる
*** 1 errors in Compile ***
とあります。
プログラミングコンテストチャレンジブックなどである方法のように LL でint型より大きな整数を扱いたいのですが
どうすれば解決しますでしょうか。
よろしくお願いします。
/*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型より大きな整数を扱いたいのですが
どうすれば解決しますでしょうか。
よろしくお願いします。
Re: int型より大きな型
__int64という型を使うとできるかもしれないです。
BCC32には64bit整数型ないのでしょうか? • C言語交流フォーラム ~ mixC++ ~
BCC32には64bit整数型ないのでしょうか? • C言語交流フォーラム ~ mixC++ ~
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: int型より大きな型
ちなみに、これは32ビット符号付き整数の範囲の計算でできます。(2^31-1 = 2147483647 > 2*(10^9+7))Steg さんが書きました:具体的には、フィボナッチ数列のFnから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で殴ればいい!(死亡フラグ)
Re: int型より大きな型
VisualStudioでは用いることができるのはそのあたりの違いなんですかね。ありがとうございました。naohiro19 さんが書きました:long long int型は「C99」以降で導入された型なので使えません。
みけ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でもありませんでした。
Re: int型より大きな型
MAXがint型と認識され、オーバーフローしているかもしれません。Steg さんが書きました:ですが、出力に
1410065408
と明らかに桁溢れしています。
int型の範囲のリテラルを__int64型にキャストし、それを用いた計算式でMAXを表現するといいかもしれません。
試したところ、書式の修正のみで出力が改善しました。
Steg さんが書きました:フォーマットは%lldではないということでしょうか?%ldでもありませんでした。
今回はunsignedではないので、%I64lldでいいと思います。non さんが書きました:BCCではlong long型の書式指定子が、違うようです。
printf("%I64llu ",a[j]);
で、試してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)