题意:以二进制的形式给出一串数列(例:11101),要求按照
斐波那契数列的规律化为10进制,斐波那契数列1,2,3,5,8,13,21···,其标号分别为F0,F1,F2,F3···,化为十进制:1*1+2*0+3*1+5*1+8*1=17.数列11101的标准形式为:100101(中间不能有连续两个或两个以上的1出现即为标准形式,对每个十进制数字,
标准形式有且只有一种)。
要求输入两串数列,用空格隔开。输出两串数列的标准形式以及两串数列的相加结果,结果也要用标准形式表示。
思路:
先将输入的两串数列化为两个十进制数字,再计算其和,得到三个十进制数字,对于每个十进制数字,按照公式:F[N]<=NUM<F[N+1](F[N]表示第N个斐波那契数);NUM-=F[N];进行迭代,直到NUM==0为止。
最后要注意
前导零的情况,开始输入是先进行一次扫描清前导零(开始没注意,贡献了一次WA~~(╯﹏╰)~~)
PS:输入的数据可能是0 0,0 XXX,XXX 0.
代码:
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
double
f
[
50
]
=
{
1
,
2
},
sum1
,
sum2
,
sum;
int
s1
[
40
],
s2
[
40
],
s3
[
40
],n;
string
a
,b;
char
*
a1
,
*
a2
,
*
a3;
for(
int
i
=
2;
i
<
50;
i
++)
f
[
i
]
=
f
[
i
-
1
]
+
f
[
i
-
2
];
while(
cin
>>
a
>>b)
{
int
t1
=
0
,
t2
=
0;
for(
int
i
=
0;
i
<
a
.
size();
i
++)
if(
a
[
i
]
!=
'0'
){
t1
=
i;
break
;}
for(
int
i
=
0;
i
<b
.
size();
i
++)
if(b
[
i
]
!=
'0'
){
t2
=
i;
break
;}
sum1
=
sum2
=
sum
=
0;
memset(
s1
,
-
1
,
sizeof(
s1));
memset(
s2
,
-
1
,
sizeof(
s2));
memset(
s3
,
-
1
,
sizeof(
s3));
for(
int
i
=
a
.
size()
-
1
,
j
=
0;
i
>=
0;
i
--
,
j
++)
if(
a
[
i
]
==
'1')
sum1
+=
f
[
j
];
for(
int
i
=b
.
size()
-
1
,
j
=
0;
i
>=
0;
i
--
,
j
++)
if(b
[
i
]
==
'1')
sum2
+=
f
[
j
];
sum
=
sum1
+
sum2;
n
=
0;
while(
sum1
>
0)
{
int
i
=
0;
while(
sum1
>=
f
[
i
])
i
++;
s1
[n
++
]
=--
i;
sum1
-=
f
[
i
];
}
n
=
0;
while(
sum2
>
0)
{
int
i
=
0;
while(
sum2
>=
f
[
i
])
i
++;
s2
[n
++
]
=--
i;
sum2
-=
f
[
i
];
}
n
=
0;
while(
sum
>
0)
{
int
i
=
0;
while(
sum
>=
f
[
i
])
i
++;
s3
[n
++
]
=--
i;
sum
-=
f
[
i
];
}
a1
=
new
char
[
s1
[
0
]
+
2
];
a2
=
new
char
[
s2
[
0
]
+
2
];
a3
=
new
char
[
s3
[
0
]
+
2
];
memset(
a1
,
'0'
,(
s1
[
0
]
+
2)
*
sizeof(
char));
memset(
a2
,
'0'
,(
s2
[
0
]
+
2)
*
sizeof(
char));
memset(
a3
,
'0'
,(
s3
[
0
]
+
2)
*
sizeof(
char));
a1
[
s1
[
0
]
+
1
]
=
a2
[
s2
[
0
]
+
1
]
=
a3
[
s3
[
0
]
+
1
]
=
'\0';
for(
int
i
=
0;
s1
[
i
]
!=-
1;
i
++)
a1
[
s1
[
0
]
-
s1
[
i
]]
=
'1';
for(
int
i
=
0;
s2
[
i
]
!=-
1;
i
++)
a2
[
s2
[
0
]
-
s2
[
i
]]
=
'1';
for(
int
i
=
0;
s3
[
i
]
!=-
1;
i
++)
a3
[
s3
[
0
]
-
s3
[
i
]]
=
'1';
if(
a
[
t1
]
==
'0'
&&b
[
t2
]
!=
'0')
{
cout
<<
setw(
s3
[
0
]
+
3)
<<
0
<<
endl
<<
"+"
<<
setw(
s3
[
0
]
+
2)
<<
a2
<<
endl
<<
" ";
for(
int
i
=
0;
i
<
s3
[
0
]
+
1;
i
++)
cout
<<
"-";
cout
<<
endl
<<
setw(
s3
[
0
]
+
3)
<<
a3
<<
endl
<<
endl;
}
else
if(
a
[
t1
]
!=
'0'
&&b
[
t2
]
==
'0')
{
cout
<<
setw(
s3
[
0
]
+
3)
<<
a1
<<
endl
<<
"+"
<<
setw(
s3
[
0
]
+
2)
<<
0
<<
endl
<<
" ";
for(
int
i
=
0;
i
<
s3
[
0
]
+
1;
i
++)
cout
<<
"-";
cout
<<
endl
<<
setw(
s3
[
0
]
+
3)
<<
a3
<<
endl
<<
endl;
}
else
if(
a
[
t1
]
==
'0'
&&b
[
t2
]
==
'0')
{
cout
<<
setw(
3)
<<
0
<<
endl
<<
"+"
<<
setw(
2)
<<
0
<<
endl
<<
" -"
<<
endl
<<
setw(
3)
<<
0
<<
endl
<<
endl;
}
else
{
cout
<<
setw(
s3
[
0
]
+
3)
<<
a1
<<
endl
<<
"+"
<<
setw(
s3
[
0
]
+
2)
<<
a2
<<
endl
<<
" ";
for(
int
i
=
0;
i
<
s3
[
0
]
+
1;
i
++)
cout
<<
"-";
cout
<<
endl
<<
setw(
s3
[
0
]
+
3)
<<
a3
<<
endl
<<
endl;
}
delete
[]
a1;
delete
[]
a2;
delete
[]
a3;
}
return
0;
}
#include<iomanip>
#include<string>
using namespace std;
int main()
{
}