一道C++新手循环练习的题目

题目如下:

输入两个正整数n<m<10^6,输出1/n^2 + 1/(n+1)^2 + ... +1/m^2 ,保留五位小数,输入包含多组数据,结束标记为 n=m=0

样例输入:

2  4

65536 655360

0  0

样例输出:

Case 1: 0.42361

Case 2: 0.00001

小伙伴们可以先尝试一下哦!

————————————————分割线 题目解析———————————————————

首先这个题目要学会多组数据输入,这里先展示适用于本题目的一种,其它多组数据输入方法别的博客写的很清楚,后续有需要我会整理。

具体后面的数字到底表示什么我不太清楚,但是用途是这么用的。有知道的小伙伴还请赐教!

#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d",&n) == 1) //这里的1是指有n这一个
{
//输入你要循环的内容
}
return 0;
}
//输入格式:
//2 3

#include <stdio.h>
int main()
{
int m = 0, n = 0
while(scanf("%d %d",&n,&m) == 2) //这里的2是指m,n两个 
{
 //你要循环的内容
}

return 0;
}

知道多组输入数据,接下来就可以写代码了,以下是细节陷阱!

​#include <stdio.h>
int main()
{
	int n = 0, m = 0, kase = 0;
	double f = 0,sum = 0;
	while(scanf("%d %d",&n,&m) == 2)
	{
		if (n == 0 && m == 0)
		{
		break;
		}
		for(int i = n; i <= m; i++)
		{
			f = 1.0/double(i*i); //如果你觉得这里没问题就大错特错了!
			sum = sum + f;
			f = 0;
		}
		printf("Case %d: %.5f\n",++kase,sum);
		sum = 0;
	}
	return 0;
}

​

你会发现第二组样例输入是错误的,不信可以运行一下!

这是什么原因呢?

原来是平方过后的数字超出范围了,这个时候我们可以思考

如果 1/double(i*i) 不行,但是   1/i   是可以的,不会超过范围

那么改正之后的代码如下:

​#include <stdio.h>
int main()
{
	int n = 0, m = 0, kase = 0;
	double f = 0,sum = 0;
	while(scanf("%d %d",&n,&m) == 2)
	{
		if (n == 0 && m == 0)
		{
		break;
		}
		for(int i = n; i <= m; i++)
		{
			f = 1.0/i;
            f = f/i;   //也可以写成  f /= i;
			sum = sum + f;
			f = 0;
		}
		printf("Case %d: %.5f\n",++kase,sum);
		sum = 0;
	}
	return 0;
}

​

这个时候我们就解决这道题目啦

还有一些小细节大家要注意初始化变量,不要带的第一轮的值去运行第二轮,那样结果会一样

还有一个也是小细节!!!

如果把 if 条件放到后面,你运行起来是没有问题的,但是!!!

怎么可以去除以一个0呢,所以是有问题的,只是它并非会报错,而是提醒,但是不影响运行,所以直接输入0 0也是没有影响的,所以大家一定要把 if 判断放在前面!

​#include <stdio.h>
int main()
{
	int n = 0, m = 0, kase = 0;
	double f = 0,sum = 0;
	while(scanf("%d %d",&n,&m) == 2)
	{
		
		for(int i = n; i <= m; i++)
		{
			f = 1.0/double(i*i);
			sum = sum + f;
			f = 0;
		}
        if (n == 0 && m == 0)
		{
		break;
		}
		printf("Case %d: %.5f\n",++kase,sum);
		sum = 0;
	}
	return 0;
}

今天你看完这道题也在进步呢,依旧以一句话结束今天

“我走的很慢,但我绝不停留”,一旦停下来,你又会歇多久呢?

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Re.不晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值