光棍的yy
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊。
现在给你m个1,你可以把2个1组合成一个2,这样就不是光棍了,问这样的组合有多少种??
例如(111 可以拆分为 111 12 21 有三种)
-
输入
-
第一行输入一个n表示有n个测试数据
以下n行,每行输入m个1
(1 <= n,m <= 200)
输出
- 输出这种组合种数,占一行 样例输入
-
3 11 111 11111
样例输出
-
2 3 8
-
-
题解:斐波那契数列:f[0]=0; f[1]=1; f[2]=1; f[3]=2; f[n]=f[n-1]+f[n-2]......当到f[40]时就不可以用int 数据了,
-
所以接下来就是大数斐波那契.一行存一个数列的值,从上到下遵循大数相加方法。
-
1
-
2
-
3
-
5
-
8
-
3 1
-
1 2
-
4 3.......倒序输出
-
int a[210][101]; void fibnacci() { int p,q; a[1][0]=1;//赋初值 a[2][0]=2; for(int i=3;i<210;i++)//二维数组模拟斐波那契函数 { p=q=0; for(int j=0;j<101;j++) { p=a[i-1][j]+a[i-2][j]+q;//q是进位 a[i][j]=p%10;//各位值 q=p/10; } } }
-
<pre name="code" class="html">#include <cstdio> #include <cstring> int a[210][101]; void fibnacci() { int p,q; a[1][0]=1;//赋初值 a[2][0]=2; for(int i=3;i<210;i++)//二维数组模拟斐波那契函数 { p=q=0; for(int j=0;j<101;j++) { p=a[i-1][j]+a[i-2][j]+q; a[i][j]=p%10; q=p/10; } } } int main() { fibnacci(); int t; char s[202]; scanf("%d",&t); while(t--) { scanf("%s",s); int len=strlen(s); int m; for(int i=100;i>=0;i--) { if(a[len][i]!=0)//寻找sum最高位 { m=i; break; } } for(int j=m;j>=0;j++)//倒序输出 { printf("%d",a[len][j]); } printf("\n"); } return 0; }
-
第一行输入一个n表示有n个测试数据