鱼C论坛

 找回密码
 立即注册
查看: 1477|回复: 6

[已解决]入门计算题求求求助???急急急!!!

[复制链接]
发表于 2021-11-13 23:50:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
计算1-1/3+1/5-1/7...+1/101
#include<stdio.h>
int main()
{
        int a;
        float sum=0.0;
        for(a=1;a<=101;a+=2)
        {
        sum=sum+1/a;
        a=-a;
    }
    printf("%f",sum);
    return 0;
}
我这为什么运行没结果啊,要疯了,没人告诉我我可能觉都睡不着了。
最佳答案
2021-11-14 09:05:22
本帖最后由 傻眼貓咪 于 2021-11-14 09:11 编辑

你的代码问题出现在无限循环,这是很多初学者都会犯的错。
只要你记住一点,就不再会犯这种错了,就是:只要有循环语句,不管是 while 或 for,一定要确保循环语句作用域里(循环语句里面)的代码必然能够在某个时候到达退出条件,如果一辈子到达不了退出条件,试问如何退出呢?
代码解法:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int sign = 1; // 另外设 sign 变量用于存储正负值(为了不影响 a 值)
  5.     double sum;
  6.     for(int a = 1; a <= 101; a += 2){ // 这里自定退出循环条件: a > 101 便退出(所以以下代码必须确保一定会到达 a > 101 的情况,否则无限循环)
  7.         sum += 1.0/(sign*a); // 算法公式(注:这里的 1 改写成 1.0,浮点数除浮点数才能变成真正的浮点数)
  8.         sign = -sign; // 每次循环,改变 sign 正负值,不影响 a 值(a 值永远处于正整数)
  9.     }
  10.     printf("%lf", sum);
  11.     return 0;
  12. }
复制代码
输出结果:
  1. 0.790300
复制代码


当 a = 102 时候
a = -a (a 变成 -102 负数)
这样 a 不会大于 101
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-13 23:57:52 | 显示全部楼层
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.         int a , s                                                                  ;
  5.         float sum                                                                  ;
  6.         for(a = s = 1 , sum = 0.0 ; a <= 101 ; a +=2 , s = - s) sum += s * 1.0 / a ;
  7.         printf("%f\n" , sum)                                                       ;
  8. }
复制代码

        编译、运行实况:
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 0.790300

  4. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-11-14 00:02:28 | 显示全部楼层
jackz007 发表于 2021-11-13 23:57
编译、运行实况:

请问我错在哪里了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 00:08:49 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-14 00:14 编辑
宫宸 发表于 2021-11-14 00:02
请问我错在哪里了?


        第一次循环 : a = 1,a = -a = -1,
        第二次循环 : a = a + 2 = -1 + 2  = 1 , a = -a = - 1
        。。。。。。
        每次循环 a 都是 -1 ,a <= 101 永远成立,程序陷入死循环。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-11-14 08:45:53 | 显示全部楼层
宫宸 发表于 2021-11-14 00:02
请问我错在哪里了?


C/C++ 语言可以说是很直来直往的语言,你不声明,它就装傻,什么意思呢?

举例 1:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a = 3; // 这里声明 a 是整数
  5.     for(int i = 1; i < 10; i++){ // i 也是整数
  6.         printf("%.1f\n", (float)(i/a)); // 这里声明 i 除 a 得浮点数(注:这里是结果变成浮点数,不是运行算法的之前就变成浮点数)
  7.     }
  8.     return 0;
  9. }
复制代码
输出结果:
  1. 0.0
  2. 0.0
  3. 1.0
  4. 1.0
  5. 1.0
  6. 2.0
  7. 2.0
  8. 2.0
  9. 3.0
复制代码
明显答案输出不对啊,这是因为你没有声明,所以 C/C++ "装傻"呗。
举例 2:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a = 3; // 这里声明 a 是整数
  5.     for(int i = 1; i < 10; i++){ // i 也是整数
  6.         printf("%.3f\n", ((float)i/a)); // 这里声明 i 是浮点数,然后除 a 得浮点数(注:这里是运行算法之前 i 就变成浮点数,结果变成浮点数)
  7.     }
  8.     return 0;
  9. }
复制代码
输出结果:
  1. 0.333
  2. 0.667
  3. 1.000
  4. 1.333
  5. 1.667
  6. 2.000
  7. 2.333
  8. 2.667
  9. 3.000
复制代码
这里你会发现,只要稍微改写一点点,输出结果大不相同(这里只是将 (float) 写在括号里面 i 的旁边)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 09:05:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2021-11-14 09:11 编辑

你的代码问题出现在无限循环,这是很多初学者都会犯的错。
只要你记住一点,就不再会犯这种错了,就是:只要有循环语句,不管是 while 或 for,一定要确保循环语句作用域里(循环语句里面)的代码必然能够在某个时候到达退出条件,如果一辈子到达不了退出条件,试问如何退出呢?
代码解法:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int sign = 1; // 另外设 sign 变量用于存储正负值(为了不影响 a 值)
  5.     double sum;
  6.     for(int a = 1; a <= 101; a += 2){ // 这里自定退出循环条件: a > 101 便退出(所以以下代码必须确保一定会到达 a > 101 的情况,否则无限循环)
  7.         sum += 1.0/(sign*a); // 算法公式(注:这里的 1 改写成 1.0,浮点数除浮点数才能变成真正的浮点数)
  8.         sign = -sign; // 每次循环,改变 sign 正负值,不影响 a 值(a 值永远处于正整数)
  9.     }
  10.     printf("%lf", sum);
  11.     return 0;
  12. }
复制代码
输出结果:
  1. 0.790300
复制代码


当 a = 102 时候
a = -a (a 变成 -102 负数)
这样 a 不会大于 101
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 10:15:09 | 显示全部楼层
#include<stdio.h>
int main()
{
        int a,c;
        c=1;
        float sum;
        for(a=1;a<=101;a+=2)
        {
        sum=sum+((float)c/a);
        c=-c;
    }
    printf("%f",sum);
    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 16:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表