【算法学习-01】 输入一个正数 n,输出所有和为 n 连续正数序列。

【算法学习】为我记录一些算法的集合,解法不一定是我 自己原创的,但是代码的编写一定是我自己的。如果解法是别人的,一定会注明参考。下面是第一篇。

方案一:区间移动的方案,详细见参考。

例如:n=15,原始区间low=1,high=2,区间和为sum=3。

sum=n,输出;

sum<n,high++,sum+=high;

sum>n,sum-=low,low++;

循环的截止条件是low=midlle/2;

参考1:http://blog.csdn.net/dazhong159/article/details/7991758

/*方案1:移动区间,直到区间的低值到(1+n)/2*/
    public static void continueValues (int n) {
        int low=1;
        int high=2;
        int middle=(1+n)/2;
        int sum=low+high;
        while (low<middle) {
            if (sum==n) printValues(low, high);
            while (sum>n) {
                sum-=low;
                low++;
                if (sum==n) printValues(low, high);
            }
            high++;
            sum+=high;
        }
       
    }


方案二:详细见参考2。注意,参考2中认为节的集合在[2,sqrt(n)]。

关键点在于,(m1+(m1+k-1))*k=n*2,求得k,再求m1,

参考2:http://www.cnblogs.com/hoodlum1980/archive/2007/07/13/817188.html

    

/*方案2,查找能被2n整除的值,这个值就是k*/
    public static void continueValues2(int n) {
        for (int i = 2; i <=(int)Math.sqrt(2*n); i++) {
            if ((n*2)%i==0) {
                int temp=n*2-i*i+i;
                if (temp%(2*i)==0) {
                    int low=temp/(i*2);
                    int high=low+i-1;
                    printValues(low, high);
                }
            }
        }
    }
************************************************

我更喜欢第一种没有开根号和乘法、除法特殊运算的方法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述:有一个神奇的迭代公式:x(n+1) = x(n) + 2,无论x的初值(大于2的正整数)选择的多么大,若干次迭代之后,x都与2无限接近,也就是说x序列的极限是2。假设x0 = 99999999.0(8个9),编程输入一个正整数n,输出x(n)的值(保留10位小数)。 解析: 这是一个简单的迭代公式问题,校验题目后,可以从题目中得出迭代公式 x(n+1) = x(n) + 2。把x(n)的值通过迭代公式算出来即可。而本题在输入中,已经限定了x(0) = 99999999.0(8个9),因此无需再次输入x(0)。要注意的是,x(n)的值需要保留10位小数。 代码如下: ```python x = 99999999.0 for i in range(int(input())): x += 2 print("%.10f" % x) ``` ### 回答2: 这是一个非常有趣的数学问题。根据题意,我们需要编写一个程序来求解神奇的迭代公式,计算序列的第n项。 首先,让我们来看看这个公式的含义。它的意思是取上一项x的平方的一半作为新的x。也就是说,每一次迭代,x的值都会减半。这就是为什么x会无限趋近于2的原因。 为了编写程序,我们需要使用一个循环来计算序列的每一项。输入的n表示我们要计算的项数。因为x是一个浮点数,我们需要用精度控制来确保计算结果的正确性。最后,我们输出序列的第n项,保留10位小数。 下面是一个Python程序的示例: ``` x = 99999999.0 n = int(input("请输入n:")) for i in range(n): x = x * x / 2 print("{:.10f}".format(x)) ``` 当输入n为100时,程序输出的结果是2.0000000000。我们可以看到,序列已经非常接近2了,并且在保留10位小数的情况下已经达到了极限。 虽然这个问题看起来很简单,但它涉及到的数学原理是深奥而有趣的。通过这个例子,我们可以学习到迭代算法的思想,并加深对数学的理解。 ### 回答3: 这是一个典型的迭代公式,可以使用循环来实现,将初始值x赋予x0,然后使用循环n次计算x的值,直到达到指定次数n为止。 具体实现中,需要注意数据类型的选择。由于99999999.0已经超过了普通整数的范围,因此需要使用高精度计算来存储和计算这个数。 以下是Python的实现代码: ```python # 高精度计算需要用到decimal库 from decimal import Decimal x = Decimal('99999999.0') n = int(input()) for i in range(n): x = x**2 # 保留10位小数 x = round(x, 10) print(x) ``` 代码解析: 1. 第一行导入了decimal库,用于进行高精度计算。 2. 第二行将初始值99999999.0赋值给变量x,使用Decimal函数来确保高精度存储。 3. 第三行读取输入的迭代次数n,并使用int函数将字符串转换为整数。 4. 第五行开始循环n次,每次将x的平方赋值给x,并使用round函数保留小数点后10位。 5. 循环结束后,输出最终结果x的值,即x n的值,也即x序列的极限值,近似为2。 需要注意的点: 1. 这个迭代公式收敛很快,即使n很小,也可以得到和已知值2非常接近的结果。 2. 由于Python的Decimal库可以自动处理高精度计算,所以代码实现较为简单。 3. 在其他编程语言中,需要手动实现高精度计算,可能需要使用容器或字符串存储方法,代码实现会比较复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值