您的位置:首页 > 其它

UVA 763 Fibinary Numbers

2014-09-18 13:43 381 查看
题意讲某个二进制按照规则每一位对应斐波那契数生成新的数字,然后2个数字求和。再求由该规则生成的二进制串。并且要求尽量用更大项的fib数(题目提示不能由连续的1就是2个连续的1(11)不如100更优)

用大数处理出100项fib。然后模拟交替置位位0或者1,输出

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
const int  numlen=105;
struct bign {
int len, s[numlen];
bign() {
memset(s, 0, sizeof(s));
len = 1;
}
bign(int num) { *this = num; }
bign(const char *num) { *this = num; }
bign operator = (const int num) {
char s[numlen];
sprintf(s, "%d", num);
*this = s;
return *this;
}
bign operator = (const char *num) {
len = strlen(num);
while(len > 1 && num[0] == '0') num++, len--;
for(int i = 0;i < len; i++) s[i] = num[len-i-1] - '0';
return *this;
}

void deal() {
while(len > 1 && !s[len-1]) len--;
}

bign operator + (const bign &a) const {
bign ret;
ret.len = 0;
int top = max(len, a.len) , add = 0;
for(int i = 0;add || i < top; i++) {
int now = add;
if(i < len) now += s[i];
if(i < a.len)   now += a.s[i];
ret.s[ret.len++] = now%10;
add = now/10;
}
return ret;
}
bign operator - (const bign &a) const {
bign ret;
ret.len = 0;
int cal = 0;
for(int i = 0;i < len; i++) {
int now = s[i] - cal;
if(i < a.len)   now -= a.s[i];
if(now >= 0)    cal = 0;
else {
cal = 1; now += 10;
}
ret.s[ret.len++] = now;
}
ret.deal();
return ret;
}
bign operator * (const bign &a) const {
bign ret;
ret.len = len + a.len;
for(int i = 0;i < len; i++) {
for(int j = 0;j < a.len; j++)
ret.s[i+j] += s[i]*a.s[j];
}
for(int i = 0;i < ret.len; i++) {
ret.s[i+1] += ret.s[i]/10;
ret.s[i] %= 10;
}
ret.deal();
return ret;
}

bign operator * (const int num) {
//        printf("num = %d\n", num);
bign ret;
ret.len = 0;
int bb = 0;
for(int i = 0;i < len; i++) {
int now = bb + s[i]*num;
ret.s[ret.len++] = now%10;
bb = now/10;
}
while(bb) {
ret.s[ret.len++] = bb % 10;
bb /= 10;
}
ret.deal();
return ret;
}

bign operator / (const bign &a) const {
bign ret, cur = 0;
ret.len = len;
for(int i = len-1;i >= 0; i--) {
cur = cur*10;
cur.s[0] = s[i];
while(cur >= a) {
cur -= a;
ret.s[i]++;
}
}
ret.deal();
return ret;
}

bign operator % (const bign &a) const {
bign b = *this / a;
return *this - b*a;
}

bign operator += (const bign &a) { *this = *this + a; return *this; }
bign operator -= (const bign &a) { *this = *this - a; return *this; }
bign operator *= (const bign &a) { *this = *this * a; return *this; }
bign operator /= (const bign &a) { *this = *this / a; return *this; }
bign operator %= (const bign &a) { *this = *this % a; return *this; }

bool operator < (const bign &a) const {
if(len != a.len)    return len < a.len;
for(int i = len-1;i >= 0; i--) if(s[i] != a.s[i])
return s[i] < a.s[i];
return false;
}
bool operator > (const bign &a) const  { return a < *this; }
bool operator <= (const bign &a) const { return !(*this > a); }
bool operator >= (const bign &a) const { return !(*this < a); }
bool operator == (const bign &a) const { return !(*this > a || *this < a); }
bool operator != (const bign &a) const { return *this > a || *this < a; }

string str() const {
string ret = "";
for(int i = 0;i < len; i++) ret = char(s[i] + '0') + ret;
return ret;
}
};
istream& operator >> (istream &in, bign &x) {
string s;
in >> s;
x = s.c_str();
return in;
}
ostream& operator << (ostream &out, const bign &x) {
out << x.str();
return out;
}
char a[numlen],b[numlen];
bign fib[numlen];
void init()
{
fib[0]=1;fib[1]=1;  fib[2]=2;
for (int i=3;i<numlen;i++) fib[i]=fib[i-1]+fib[i-2];
}
bign trans(char *a)
{
bign sum=0;
int len=strlen(a);
for (int i=1;i<=len;i++)
if (a[i-1]=='1')
sum+=fib[len-i+1];
//cout<<sum<<endl;
return sum;
}
bign tmp;
void slove(bign sum)
{
if (sum==tmp) {puts("0");return ;}
int i=1;
for (i=1;i<numlen;i++)
if (fib[i]>sum) break;
i--;
bool flag=true;
for (;i>0;i--)
{
//cout<<sum<<' '<<fib[i]<<endl;
if (fib[i]<=sum && flag)
{
printf("1");
sum=sum-fib[i];
flag=false;
}
else
{
printf("0");
flag=true;
}
}
putchar('\n');
}
int main()
{
init();
bool first=false;
while (scanf("%s%s",a,b)!=EOF)
{
if (first) putchar('\n');
else first=true;
tmp=0;
bign num1=trans(a);
bign num2=trans(b);
bign sum=num1+num2;
//cout<<sum<<endl;
//for (int i=1;i<=10;i++) cout<<fib[i]<<' ';cout<<endl;
slove(sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: