新手程序,帮忙看一下哪里错了

如此彻底 2019-05-10 03:32:20
#include <stdio.h> int main(void) { int n, i, m; float e = 0.0f, h printf ("Enter a number: "); scanf ("%d", &n); for (m = 1, i = 1; i <= n; i++) { m *= i; e += 1 / m; } printf ("%f", e); return 0; }
...全文
1075 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_44798138 2019-05-14
  • 打赏
  • 举报
回复
h那里连个分号都没有。还有 1/m会等于0 要1.0/m
636f6c696e 2019-05-13
  • 打赏
  • 举报
回复
三个问题:

#include <stdio.h>
int main(void)
{
    int n, i;
    float m = 1.0f;
    float e = 0.0f; //编译错误少了分号

    printf ("Enter a number: ");
    scanf ("%d", &n);

    for (m = 1, i = 1; i <= n; i++) {
            //m *= i; 输入n较大时,int类型的m溢出变为0
            //e += 1 / m;  1/m会转换成整形,m>1时都为0
            m /= i;
            e += m;
    }

    printf ("%f", e);

     return 0;
}
Isclowns 2019-05-13
  • 打赏
  • 举报
回复
float那一行最后要加分号,还有h多余了,也要去掉
好运萝 2019-05-13
  • 打赏
  • 举报
回复
引用 16 楼 袁君元 的回复:
[quote=引用 6 楼 KarivV 的回复:]应该是由于你输入的n过大了
一定要自己去试一试啊
棉猴 2019-05-13
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int n, i, m;
float e = 0.0f;//去掉h

printf("Enter a number: ");
scanf("%d", &n);

for (m = 1, i = 1; i <= n; i++) {
m *= i;
e += 1.0/ m;//1改为1.0,此时当m大于1时,1.0/m的值才不为0
}

printf("%f", e);
return 0;
}

运行结果如下
OH_PRO 2019-05-13
  • 打赏
  • 举报
回复
你的float 这一行后面没带分号
CaptainXue 2019-05-13
  • 打赏
  • 举报
回复
引用 7 楼 如此彻底 的回复:
[quote=引用 4 楼 weixin_43956598 的回复:]问题在于:你对程序中的”/“符号理解不对,程序中的/得到的是商,所以1/m当m大于1的时,得到的值始终为0,所以你要把他改为小数形式,得到的结果才是数学意义上的商。可以关注我的博文,上面讲了新手容易犯错的地方! 附上修改后的代码:

#include <stdio.h>
int main(void)
{
    int n, i, m;
    float e = 0.0f; 
    printf ("Enter a number: ");
    scanf ("%d", &n);
    for (m = 1, i = 1; i <= n; i++) {
            m *= i;
            e += 1.0 / m;//1/m错误,c语言中/得到的是商,区别数学中的除法 
    }
    
    printf ("%f", e);
    
     return 0;
}


Error: operator '/' divided by zero 错误文件路径(error file path):/var/mobile/Containers/Data/Application/8646E462-48BB-45A9-AA5F-1F828A65AADE/Documents/KeepData/files/1246.cpp 哪行出错(wrong line):12 [/quote]你是用的什么编译环境,我是在windows下的dev-c++编译运行没有错误的,麻烦上传你的程序截图,还有说一下你具体要计算什么
CaptainXue 2019-05-13
  • 打赏
  • 举报
回复
你是用的什么编译环境,我是在windows下的dev-c++编译运行没有错误的,麻烦上传你的程序截图
CaptainXue 2019-05-13
  • 打赏
  • 举报
回复
引用 6 楼 KarivV 的回复:
应该是由于你输入的n过大了 式中m是计算n的阶乘 很快就会超过int的 范围 2^32-1 n = 13的时候m就开始计算错误了 并且e += 1 / m;这一句 其中1为int m也为int类型 1/m是一个int类型会造成精度损失 应该写成e += 1. / m; 或者干脆把m定义成double类型
这里的m如果纯定义为double型并不能解决问题,当m大于1时,1/m的值还是为0,因为对于整数来说,程序中的/运算求的是商值。要写为1.0/m才能得到准确的小数值
如此彻底 2019-05-10
  • 打赏
  • 举报
回复
引用 6 楼 KarivV 的回复:
应该是由于你输入的n过大了 式中m是计算n的阶乘 很快就会超过int的 范围 2^32-1 n = 13的时候m就开始计算错误了 并且e += 1 / m;这一句 其中1为int m也为int类型 1/m是一个int类型会造成精度损失 应该写成e += 1. / m; 或者干脆把m定义成double类型
正解正解
如此彻底 2019-05-10
  • 打赏
  • 举报
回复
引用 5 楼 OrdinaryCoder 的回复:
[quote=引用 1 楼 如此彻底 的回复:]
环境弹出来的说是十二行的问题,Error: operator '/' divided by zero。没搞懂,他说是被0除了

改成int m,i =1;
for (; i <= n; i++) {
m *= i;
e += 1 / m;
}
这样试一下[/quote]谢谢了,解决了
勤奋的执着 2019-05-10
  • 打赏
  • 举报
回复

#include <stdio.h>
int main(void)
{
    int n, i, m;
    float e = 0.0f, h;   //此处缺少分号
    
    printf ("Enter a number: ");
    scanf ("%d", &n);
    
    for (m = 1, i = 1; i <= n; i++)  
    {
            m *= i;
            e += 1 / m;     // 此处1/m 得出是整型,会把小数点忽略
    }
    
    printf ("%f", e);
    
     return 0;
}
就两个地方,没有其他问题,你所说的Error: operator '/' divided by zero。这种报错没有。 编译器GCC
好运萝 2019-05-10
  • 打赏
  • 举报
回复
引用 11 楼 KarivV 的回复:
[quote=引用 10 楼 如此彻底 的回复:] 额,没太看懂。能把修改后的程序写出来吗
[/quote] 这里说错了 要 n = 14能够获得小数点后10位的精度 如果想要计算小数点后无限位 建议去学大数运算
好运萝 2019-05-10
  • 打赏
  • 举报
回复
引用 10 楼 如此彻底 的回复:
额,没太看懂。能把修改后的程序写出来吗

#include <stdio.h>

int main(void)
{
	int n, i;//, m;
	double m, e = 1.;//e = 1 + 1 + 1/2 + ....+1 / n!

	printf("Enter a number: "); 
	scanf("%d", &n);//n的输入值不应过大  n = 12, 13就能获得 e-10精度的e

	for (m = 1, i = 1; i <= n; i++) 
	{
		m *= i;
		e += 1. / m; //这里的1应为浮点型
	}

	printf("%.10f", e);
	return 0;
}
如此彻底 2019-05-10
  • 打赏
  • 举报
回复
额,没太看懂。能把修改后的程序写出来吗
好运萝 2019-05-10
  • 打赏
  • 举报
回复
此外你的计算公式都不对 前面少了个1 循环结束后 e += 1 才能得到自然对数的底
如此彻底 2019-05-10
  • 打赏
  • 举报
回复
引用 4 楼 weixin_43956598 的回复:
问题在于:你对程序中的”/“符号理解不对,程序中的/得到的是商,所以1/m当m大于1的时,得到的值始终为0,所以你要把他改为小数形式,得到的结果才是数学意义上的商。可以关注我的博文,上面讲了新手容易犯错的地方! 附上修改后的代码:

#include <stdio.h>
int main(void)
{
    int n, i, m;
    float e = 0.0f; 
    printf ("Enter a number: ");
    scanf ("%d", &n);
    for (m = 1, i = 1; i <= n; i++) {
            m *= i;
            e += 1.0 / m;//1/m错误,c语言中/得到的是商,区别数学中的除法 
    }
    
    printf ("%f", e);
    
     return 0;
}


为什么还是这样
如此彻底 2019-05-10
  • 打赏
  • 举报
回复
引用 4 楼 weixin_43956598 的回复:
问题在于:你对程序中的”/“符号理解不对,程序中的/得到的是商,所以1/m当m大于1的时,得到的值始终为0,所以你要把他改为小数形式,得到的结果才是数学意义上的商。可以关注我的博文,上面讲了新手容易犯错的地方! 附上修改后的代码:

#include <stdio.h>
int main(void)
{
    int n, i, m;
    float e = 0.0f; 
    printf ("Enter a number: ");
    scanf ("%d", &n);
    for (m = 1, i = 1; i <= n; i++) {
            m *= i;
            e += 1.0 / m;//1/m错误,c语言中/得到的是商,区别数学中的除法 
    }
    
    printf ("%f", e);
    
     return 0;
}


Error: operator '/' divided by zero 错误文件路径(error file path):/var/mobile/Containers/Data/Application/8646E462-48BB-45A9-AA5F-1F828A65AADE/Documents/KeepData/files/1246.cpp 哪行出错(wrong line):12
好运萝 2019-05-10
  • 打赏
  • 举报
回复
应该是由于你输入的n过大了 式中m是计算n的阶乘 很快就会超过int的 范围 2^32-1 n = 13的时候m就开始计算错误了 并且e += 1 / m;这一句 其中1为int m也为int类型 1/m是一个int类型会造成精度损失 应该写成e += 1. / m; 或者干脆把m定义成double类型
OrdinaryCoder 2019-05-10
  • 打赏
  • 举报
回复
引用 1 楼 如此彻底 的回复:
环境弹出来的说是十二行的问题,Error: operator '/' divided by zero。没搞懂,他说是被0除了

改成int m,i =1;
for (; i <= n; i++) {
m *= i;
e += 1 / m;
}
这样试一下
加载更多回复(4)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧