鱼C论坛

 找回密码
 立即注册
查看: 1246|回复: 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,一定要确保循环语句作用域里(循环语句里面)的代码必然能够在某个时候到达退出条件,如果一辈子到达不了退出条件,试问如何退出呢?
代码解法:
#include <stdio.h>

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

当 a = 102 时候
a = -a (a 变成 -102 负数)
这样 a 不会大于 101
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-13 23:57:52 | 显示全部楼层
#include<stdio.h>
int main(void)
{
        int a , s                                                                  ;
        float sum                                                                  ;
        for(a = s = 1 , sum = 0.0 ; a <= 101 ; a +=2 , s = - s) sum += s * 1.0 / a ;
        printf("%f\n" , sum)                                                       ;
}
        编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
0.790300

D:\00.Excise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

请问我错在哪里了?
想知道小甲鱼最近在做啥?请访问 -> 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 永远成立,程序陷入死循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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


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

举例 1:
#include <stdio.h>

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

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

使用道具 举报

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

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

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

当 a = 102 时候
a = -a (a 变成 -102 负数)
这样 a 不会大于 101
想知道小甲鱼最近在做啥?请访问 -> 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 23:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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