hello kity
期待您的批阅,由于写解题报告时 不一定考虑的很周到,所以如果您有什么不懂的地方,请您留言,然而一天之内我肯定会看见您信息,再对代码注释详细,让您更好的阅读
分类
最新评论
最新留言
链接
RSS
计数器
223075
功能
HDU (1250 Hat's Fibonacci 高精度递加)
spoiler
posted @ 2011年4月21日 01:21
in 高精度相关计算
, 2884 阅读
题目的意思:就是说s[1]=1,s[2]=1,s[3]=1,s[4]=1; 其他的都用统一方程求 s [ n ]= s[n-1 ] +s [n -2 ] + s[ n-3 ] +s [ n-4];
题目分析:
其实没什么算法,就是用二维数组里的每一行 模拟每个一个大数,这一行里的第一个数就是 实际意义上的一个 “ 位 ”! 可以是以8位为一个“位”
也可以以其他位数为一“ 位 ”,这样做是为了压缩内存,也是位了能够高效模拟! 其他的跟我们 普通的加法是一样的!从左往右,把前面四行的对应的列上的值都加到 我这行的对应的列上来! 最后一个循环考虑一下,进位之类的 所以您别 一看就慌了 毕竟每个人都是由 不会到会的 如果有不懂的 您可以密我 我更详细的跟您解说{^ _ ^}
代码如下:
#include<iostream> #include<cstring> #include<cstdio> int s[10000][356]={0}; using namespace std; int solve(){ int i,j; s[1][1]=1; s[2][1]=1; s[3][1]=1; s[4][1]=1; for(i=5;i<10000;i++){ for(j=1;j<=350;j++) s[i][j]+=s[i-1][j]+s[i-2][j]+s[i-3][j]+s[i-4][j];//记得这里别把j跟I弄混淆了,我第一次为这个小错误 //找了点时间,嘿嘿 for(j=1;j<=350;j++){ if(s[i][j]>100000000){ s[i][j+1]+=s[i][j]/100000000; s[i][j]=s[i][j]%100000000; } } } return 0; } int main(){ int cas,i,j,n; solve(); while(scanf("%d",&n)!=EOF){ for(i=350;i>=1;i--){ if(s[n][i]!=0) break; } printf("%d",s[n][i]); for(j=i-1;j>=1;j--) printf("%08d",s[n][j]); printf("\n"); } return 0; }
2011年4月22日 04:34
保存了9999个数……不过为什么要弄356位呢?实际上用349位……有点浪费……想不懂,只是为了356天-=?
那个cas是跑龙套的么?
2011年4月24日 01:09
@Taro: 其实面对OJ 开大点放心点 免得浪费了WA
2011年4月27日 02:26
该省则不必省,不该则更不能省,内存无穷溃也,何患一点小意思,变量用不用也多定义些,让它们出来见见市面~
2011年4月27日 03:26
@comathlish: 呃,我非OIer……见笑了