HDU ACM 1041Computer Transformation(大数模拟+找规律)

来源:互联网 发布:淘宝高仿nike鞋店推荐 编辑:程序博客网 时间:2024/04/30 15:32

分析:大数模拟和找规律。

#include<iostream>using namespace std;char f[1001][501];/*从下面的步骤中可以看出,下一步的后半部分是前一步的整个串,所以对于后半部分有f[n]=f[n-1];从前半部分和整体可以看出,另一部分有f[n]=f[n-1]-1(奇数步),f[n]=f[n-1]+1(偶数步)。step0:1                       f[0]=0step1:01                      f[1]=0step2:10 01                   f[2]=1 =2*f[1]+1step3:0110 1001               f[3]=1 =2*f[2]-1step4:10010110 01101001       f[4]=3 =2*f[3]+1step5:0110100110010110 1001011001101001    f[5]=5 =2*f[4]-1step6:10010110011010010110100110010110 01101001100101101001011001101001  f[6]=11 =2*f[5]+1最终有f[n]=2*f[n-1]+1(n为偶数),f[n]=2*f[n-1]-1(n为奇数)  */void createtable(){int i,j;int c,fa,sum;memset(f,0,sizeof(f));for(i=2;i<=1000;i++){if(i%2==0){for(j=500,c=0;j>=0;j--){fa=f[i-1][j]*2+c;f[i][j]=fa%10;c=fa/10;}j=500;sum=f[i][j]+1;f[i][j]=sum%10;c=sum/10;while(c){sum=f[i][j-1]+c;f[i][j-1]=sum%10;c=sum/10;j--;}}else{for(j=500,c=0;j>=0;j--){fa=f[i-1][j]*2+c;f[i][j]=fa%10;c=fa/10;}j=500;sum=f[i][j]+-1;if(sum==-1){f[i][j]=9;c=-1;}else{f[i][j]=sum;c=0;}while(c==-1){sum=f[i][j-1]+c;if(sum==-1){    f[i][j]=9;     c=-1;}    else{    f[i][j]=sum;    c=0;}j++;}}}}int main(){int n,j;createtable();while(cin>>n){if(n==1)cout<<"0"<<endl;else{j=0;while(f[n][j]==0) j++;for(;j<=500;j++)putchar(f[n][j]+'0');putchar('\n');}}    return 0;}


0 0