以下是引用vvvcuu在2014-7-17 10:11:11的发言:
当A和B给定以后,f(n)将会按一定的规律出现,呈现一定的循环.因此,只需要考虑A,B即可.
设定一个数组,比如a[1000], 依次计算从1到n的f(n),令i表示循环参照量.把每次计算的f(i),依次存入数组a[]中, 设置另一个变量k,k=i/2. 依次比较a[0]到a[k-1]和a[k]到a的值(k=2;k<=i;k+=2),这个地方比较浪费时间,如果相等,跳出循环,可能需要goto,记录下此时的i值,然后计算n%i, 最后f(n)=a[n%i+k].
简单的描述了下算法, 还没写具体的代码, 一会儿写一下看看能行不.
初步估计,只要比较连续的7个数字相等就可以停止计算了. 亲测对于不同的a,b,当n=50的时候,最大的循环尽管到达30多,但并没有出现连续的7个数字和后面数字相等的情况.
个人认为,存入数组然后取出来直接用要比递归快得多. 递归只适合运算规模不大的情况下. 就这个题来说,递归1个亿的运算规模一般的计算机都需要很长时间的.
我自己测试的类似你的第一个的代码的程序, 循环依次输出50个数字的情况下就接近一分钟了.
当A和B给定以后,f(n)将会按一定的规律出现,呈现一定的循环.因此,只需要考虑A,B即可.
设定一个数组,比如a[1000], 依次计算从1到n的f(n),令i表示循环参照量.把每次计算的f(i),依次存入数组a[]中, 设置另一个变量k,k=i/2. 依次比较a[0]到a[k-1]和a[k]到a的值(k=2;k<=i;k+=2),这个地方比较浪费时间,如果相等,跳出循环,可能需要goto,记录下此时的i值,然后计算n%i, 最后f(n)=a[n%i+k].
简单的描述了下算法, 还没写具体的代码, 一会儿写一下看看能行不.
初步估计,只要比较连续的7个数字相等就可以停止计算了. 亲测对于不同的a,b,当n=50的时候,最大的循环尽管到达30多,但并没有出现连续的7个数字和后面数字相等的情况.
个人认为,存入数组然后取出来直接用要比递归快得多. 递归只适合运算规模不大的情况下. 就这个题来说,递归1个亿的运算规模一般的计算机都需要很长时间的.
我自己测试的类似你的第一个的代码的程序, 循环依次输出50个数字的情况下就接近一分钟了.