Problem B
Accepts: 2288
Submissions: 8466
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
1 3 8Hint如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。 高精度计算
#include <iostream>
using namespace std;
long long a[210][3];
int main()
{
int T,n;
a[1][2]=1;
a[2][2]=2;
a[3][2]=3;
for(int i=4;i<=200;i++)
{
a[i][2] = a[i-1][2]+a[i-2][2];
a[i][1] = a[i-1][1]+a[i-2][1];
a[i][0] = a[i-1][0]+a[i-2][0];
if(a[i][2]>1000000000000000000)
{
a[i][2]-=1000000000000000000;
a[i][1]++;
}
if(a[i][1]>1000000000000000000)
{
a[i][1]-=1000000000000000000;
a[i][2]++;
}
cout << "a[" << i << "] = " ;
if(a[i][0]!=0) cout<< a[i][0];
if(a[i][1]!=0) cout<< a[i][1];
cout << a[i][2]<< endl;
}
cin >> T;
while(T--)
{
cin >> n;
cout << a[n] << endl;
}
}
附上搜题目的时候,看到的别人的解法,,http://blog.csdn.net/wzngzaixiaomantou/article/details/51418869。。
引用上面的解法,考虑怎么自动化,不然每次都自己考虑位数问题,,好方。。
#include <iostream>
using namespace std;
#define maxn 210
int a[maxn][maxn];
int main()
{
int T,n,j;
a[1][maxn-1]=1;
a[2][maxn-1]=2;
a[3][maxn-1]=3;
for(int i=4;i<=200;i++)
{
for(j=maxn-1 ; j>=0 ; j--)
{
a[i][j] += (a[i-1][j]+a[i-2][j]);
if(a[i][j]>=10)
{
a[i][j]-=10;
a[i][j-1]++;
}
}
cout << "a[" << i << "] = " ;
j=0;
while(a[i][j]==0) j++;
while(j<maxn) cout<< a[i][j++];
cout << endl;
}
cin >> T;
while(T--)
{
cin >> n;
cout << a[n] << endl;
}
}
改的过程中,,发现写的第一个程序是错的。。
a[i][j] += (a[i-1][j]+a[i-2][j]); 之前写的是 a[i][j] = (a[i-1][j]+a[i-2][j]);
哎。。。。简单的加法器都。。
改完后发现还有问题。。
问题的症结在于,我想用100.....进制的加法器
然后我尝试从简单的开始,100进制的,结果出现如下问题
a[20] 比前面的还小了,找原因,,发现 a[20][2]=1;a[20][1] = 9;a[20][0]=46 这样打印出来就成了 1946,,晕
来来来,我们来写一个任意进制的。
“任意n” 需要改
#define jinzhi n
#define jinzhi_wei "n-1的位数"
#include<iostream>
#include <iomanip>
using namespace std;
#define maxn 210
#define jinzhi 1000000000
#define jinzhi_wei 9
int a[maxn][maxn];
int main()
{
int j;
a[1][0]=1;
a[2][0]=2;
for(int i=3;i<=200;i++)
{
for(j=0;j<maxn;j++)
{
a[i][j] += a[i-1][j]+a[i-2][j];
//cout << "a[" << i << "]["<<j<<"]="<< a[i][j] << endl;
if(a[i][j]>=jinzhi)
{
a[i][j] -= jinzhi;
a[i][j+1] ++;
}
}
j--;
while(a[i][j]==0)
j--;
cout << a[i][j];
j--;
for(;j>=0;j--)
{
cout.fill('0');
cout<<setw(jinzhi_wei);
cout << a[i][j];
}
cout << endl;
}
}
来来来,我们再把第一个程序改的可以用
#include<iostream>
#include <iomanip>
using namespace std;
#define maxn 210
#define jinzhi 1000000000000000000
#define jinzhi_wei 18
long long a[maxn][3];
int main()
{
int j;
a[1][0]=1;
a[2][0]=2;
for(int i=3;i<=200;i++)
{
for(j=0;j<3;j++)
{
a[i][j] += a[i-1][j]+a[i-2][j];
//cout << "a[" << i << "]["<<j<<"]="<< a[i][j] << endl;
if(a[i][j]>=jinzhi)
{
a[i][j] -= jinzhi;
a[i][j+1] ++;
}
}
j--;
while(a[i][j]==0)
j--;
cout << a[i][j];
j--;
for(;j>=0;j--)
{
cout.fill('0');
cout<<setw(jinzhi_wei);
cout << a[i][j];
}
cout << endl;
}
}