<boost/multiprecision/cpp_int.hpp>
Posted: 2015年9月11日(金) 17:49
いつもお世話になっています。
今日はboostの多倍長整数演算に絡んだ質問を使用と思います。
三角数と平方数が等しい時にその値を出力するようなプログラムを書いたのですが、動作がつかめなくて困っています。
具体的には、入力が10000までは正常に動くのですが、100000になると何も表示されなくなります。1000000はコアダンプになります。
sizeof(int)で確認したところ、32bitだったので入力は4294967296までは問題無いはずです。
また、main関数内でコメントアウトしているif処理のところに関して、bisearchではちゃんと1を返しているのにも関わらず、ちゃんと値をcoutしない(なぜか36だけ出力する)状態です。とりあえずbisearch内で出力するように変更したので、問題ないと思ったのですが、今度は冒頭の問題が発生しました。
mp::cpp_int型で比較演算が可能なことは検証してありますし、何が問題なのか自分では全く分かりません。
どうかご助力お願いします。
今日はboostの多倍長整数演算に絡んだ質問を使用と思います。
三角数と平方数が等しい時にその値を出力するようなプログラムを書いたのですが、動作がつかめなくて困っています。
具体的には、入力が10000までは正常に動くのですが、100000になると何も表示されなくなります。1000000はコアダンプになります。
sizeof(int)で確認したところ、32bitだったので入力は4294967296までは問題無いはずです。
また、main関数内でコメントアウトしているif処理のところに関して、bisearchではちゃんと1を返しているのにも関わらず、ちゃんと値をcoutしない(なぜか36だけ出力する)状態です。とりあえずbisearch内で出力するように変更したので、問題ないと思ったのですが、今度は冒頭の問題が発生しました。
mp::cpp_int型で比較演算が可能なことは検証してありますし、何が問題なのか自分では全く分かりません。
どうかご助力お願いします。
#include<iostream>
#include<boost/multiprecision/cpp_int.hpp>
namespace mp=boost::multiprecision;
int bisearch(mp::cpp_int *b,mp::cpp_int tar,int s,int e)
{
int m=(s+e)/2;
/*
std::cout<<"--------------------"<<std::endl;
std::cout<<tar<<","<<b[m]<<std::endl;
std::cout<<"--------------------"<<std::endl;
*/
if(tar==b[m])
{
std::cout<<"@"<<std::endl;
std::cout<<tar<<std::endl;
return 1;
}
else if(s<m)
{
if(b[m]<tar)
{
bisearch(b,tar,m+1,e);
}
else
{
bisearch(b,tar,s,m);
}
}
else
{
return 0;
}
}
int main()
{
int i;
int n;
std::cin>>n;
mp::cpp_int a[n+1],b[n+1];
for(i=1;i<=n;i++)
{
a[i]=i*i;
b[i]=i*(i+1)/2;
}
for(i=1;i<=n;i++)
{
// std::cout<<a[i]<<std::endl;
bisearch(b,a[i],i,n);
/*
if(bisearch(b,a[i],i,n)==1)
{
std::cout<<a[i]<<std::endl;
}
*/
}
return 0;
}