1.6解不等式 1.6.1 平方根不等式

//《至美——C程序设计》

在这个前辈的代码上改了一点
S1赋值, s1 = 1; //赋值 如果提前未赋值会有警告,所以我就想赋值。然后我是在for循环里写的

在这里插入图片描述

 while (1)
    {
        m++;
        s = 0;
        s1 = 1;
        for (i = m; i <= 2 * m; i++)
            s += sqrt(i);    /*对每一个m计算和s*/

这会运行结果有问题,因为最后一次的s1=s显示的是 在for循环里赋给的值

以下为改进原代码

#include<stdio.h>
#include<math.h>
void main()
{
    long i, m;
    double n, s, s1;
    printf("请输入正数n(n>3):");
    scanf_s("%lf", &n);    /*输入任意正数*/
    m = 0;       s1 = 1;   //赋值

    while (1)
    {
        m++;
        s = 0;
 
        for (i = m; i <= 2 * m; i++)
            s += sqrt(i);    /*对每一个m计算和s*/

        if (s >= n)
            break;
        else
            s1 = s;     /*为以下注明提供依据*/
    }

    printf("不等式的解为:m>=%ld\n", m);
    printf("注:当m=%ld时,s=%.2f;当m=%ld时,s=%.2f\n", m - 1, s1, m, s);

}

https://blog.csdn.net/double_main/article/details/53418253?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160362290519195264712883%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160362290519195264712883&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v1~rank_blog_v1-1-53418253.pc_v1_rank_blog_v1&utm_term=%E4%B8%8D%E7%AD%89%E5%BC%8F&spm=1018.2118.3001.4187

对指定的正数n,试求满足以下平方根不等式的正整数;
√m+√(m+1)+√(m+2)+···+√(2*m)>=n

1.说明:
显然不等式左边是m的增函数,因而对于指定的正数n设置m循环,m从1开始递增1取值,对每一个m求和:
s(m)=√m+√(m+1)+√(m+3)+···√(2*m)

如果s(m) < n;
m增1后继续按上式求和判别,直至s>=n时输出不等式的解。

2.程序设计:
(1).应用循环设计求解;

#include<stdio.h>
#include<math.h>
void main()
{
  long i,m;
  double n,s,s1;
  printf("请输入正数n(n>3):");
    scanf("%lf",&n);    /*输入任意正数*/
  m=0;
  while(1)
  {
    m++;
    s=0;
    for(i=m;i<=2*m;i++)
      s+=sqrt(i);    /*对每一个m计算和s*/
    if(s>=n)
      break;
    else 
      s1=s;     /*为以下注明提供依据*/
  }
  printf("不等式的解为:m>=%ld\n",m);
  printf("注:当m=%ld时,s=%.2f;当m=%ld时,s=%.2f\n",m-1,s1,m,s);
  getch();
}

(2).应用递推设计求解;
事实上,可以建立s(m)与s(m-1)之间的递推关系,应用递推简化求解平方根不等式。
对于m-1与m,累加和s(m)与s(m-1)显然满足以下递推关系:
s(m)=s(m-1)-√(m-1)+√(2* m-1)+√(2* m)
初始条件:s(1)=1+√2

因此,前面程序设计中的双循环可简化为单循环,程序效率得以大大提高。

#include<stdio.h>
#include<math.h>
void main()
{
  long m;
  double n,s,s1;
  printf("请输入正数n(n>3):");
    scanf("%lf",&n);
  m=1;
  s=1.0+sqrt(2);
  do
  {
    m++;
    s1=s;
    s=s-sqrt(m-1)+sqrt(2*m-1)+sqrt(2*m);
  }while(s<n);
  printf("不等式的解为:m>=%ld\n",m);
  printf("注:当m=%ld时,s=%.2f;当m=%ld时,s=%.2f\n",m-1,s1,m,s);
  getch();
}

```c
 #include<stdio.h>
#include<math.h>
void main()
{
  long m;
  double n,s,s1;
  printf("请输入正数n(n>3):");
    scanf("%lf",&n);
  m=1;
  s=1.0+sqrt(2);
  do
  {
    m++;
    s1=s;
    s=s-sqrt(m-1)+sqrt(2*m-1)+sqrt(2*m);
  }while(s<n);
  printf("不等式的解为:m>=%ld\n",m);
  printf("注:当m=%ld时,s=%.2f;当m=%ld时,s=%.2f\n",m-1,s1,m,s);
  getch();
}

3.程序运行示例及其注意事项:
请输入正数n(n>3):2017
不等式的解为:m>=140
注:当m=139时,s=2011.83;当m=140时,s=2033.48

注意:以上程序中的“注”对解不等式并不是必要的,只是为了说明不等式解。同时,输入的数不限定为整数,可为任意正数(约定n>3)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值