关于练习6-循环结构1的感悟

关于这个练习6,虽然题量很大,有32道题,但好在大部分题目都很简单,部分题目略有难度,有些关于数列的题可以运用高中的数列公式无脑解决,而有的题则不能,还让我掌握了一种新的方法,让我很是惊喜。
1011(牛牛学数列)

题目描述

牛牛开始学习数列啦
现在他想知道1-2+3-4...+n的值

输入描述:

输入一个整数n (1≤n≤100)

输出描述:

输出一个整数
不难看出,相邻两个数(1-2,3-4,5-6,……)的和总是-1。所以,可以写出以下程序:
#include<iostream>
using namespace std;
int main()
{	
    int n;
    cin>>n;
    {
    if(n%2==0) cout<<(-1)*n/2;
    if(n%2!=0) cout<<((-1)*n/2)+n;
    }
    return 0;
}
但是,如果正常写程序,该怎么写呢?
#include<iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int sum = 0;
    for(int i = 1; i <= n; i++) {
        if(i % 2 == 0) {
            sum -= i;
        } else {
            sum += i;
        }
    }
    cout << sum << endl;
    return 0;
}
其实也可从另一个角度来看这道题:凡是减去的数,都是偶数,而凡是加上的数,都是奇数。所以,也可以以此为思路编写程序,并且可以更好地体现对循环的运用。
但对于1012(牛牛学数列2)来说,就没有规律可言了,这时,就得使用一个新方法了。

题目描述

这次牛牛又换了个数列,他想计算:1+1/2+1/3+…+1/N的值。(保留6位小数)

输入描述:

输入一个整数,范围在0到1000

输出描述:

输出一个浮点数
乍一看,这既不是等差数列,也不是等比数列,怎么办呢?其实,仔细观察,就会发现,数列的每一项分子都是1,分母都是后一项比前一项大1。这样,就可以应用新方法了:
#include <iostream>
using namespace std;
int main ()
{
	int i;
	double a[100],n,sum=0,q=1;
	scanf ("%lf",&n);
	for (i=1;i<=n;i++)
	{
	a[i]=1/q++;
	sum=sum+a[i];	
	}
	printf ("%.6f",sum);
}
其中,q(可看作公差)、计数器sum、循环条件中的n以及数组的数据类型都必须是double型,缺一不可。在之后的练习中,也多次以这道题为模板出题,所以这道题所运用的方法很重要,值得记忆。
再比如一些规律很复杂的数列,就不建议再用数学知识编写代码了,例如1010(输出奇偶数之和)

利用循环输出1∼n之间的所有奇数的和、偶数的和。

输入描述:

输入n。(1 ≤ n ≤ 10000)

输出描述:

输出为一行,两个数(用一个空格隔开),偶数之和与奇数之和

其实这道题也可看作奇数列求和与偶数列求和,所以可以这样写代码:
#include<iostream>
using namespace std;
int main()
{	
    int n;
    while(scanf("%d",&n)!=EOF)
    {
      if(n%2==0) cout<<((2+n)*n/2)/2<<" "<<((1+n-1)*n/2)/2<<endl;
      if(n%2!=0) cout<<((2+n)*n/2)/2<<" "<<((1+n)*(n/2+1))/2<<endl;
    }
    return 0;
}
显然这样不是很简便,难以理解。不如直接按照题目的意思写代码:
#include<iostream>
using namespace std;
int main() {
    int n,i;
    cin >> n;
    int odd = 0, even = 0;
    for(i = 1; i <= n; i++) 
    {
        if(i%2==0) 
        {
        even+=i;
        }else 
        {
        odd+=i;
        }
    }
    cout << even <<" "<< odd << endl;
    return 0;
}
这样写既简单又易于理解。
总结一下,就是这个练习6注重的是对思路的一个扩展和纠正,如果能坚持以循环的方法完成题目,必定会收获颇丰。


全部评论
总结后的收货会更大,加油
1 回复 分享
发布于 2023-12-27 20:19 黑龙江

相关推荐

02-09 16:14
武汉大学 Java
1.&nbsp;问一下本科经历2.&nbsp;介绍一下你第一个项目3.&nbsp;DDD分层架构比传统的MVC有哪些好处?4.&nbsp;你设计的业务分配的算法介绍一下?5.&nbsp;算法有哪些优化思路?6.&nbsp;动态标签列设计怎么思考的?7.&nbsp;数据量有多大?8.&nbsp;数据量很大的话,数据存储怎么优化?9.&nbsp;如何保证缓存和数据库之间的数据一致性?10.&nbsp;相对于你这个项目用哪种方案?11.&nbsp;项目中遇到的最大的困难是什么?12.&nbsp;介绍一下第二个项目13.&nbsp;模型分析diff的上下文怎么考虑?14.&nbsp;如果diff的关联的上下文很长超过token,你会怎么办?15.&nbsp;你想的这种方案,最后输入给模型的prompt是什么?16.&nbsp;对于大模型的其他组件如RAG和skills有了解吗?17.&nbsp;那你有想过把代码拆分成一些知识库放在rag里面吗?18.&nbsp;有对比过其他模型的分析效果吗?19.&nbsp;golang有了解吗?20.&nbsp;HashMap的底层结构21.&nbsp;为什么要用红黑树?22.&nbsp;红黑树增删的时间复杂度?23.&nbsp;MySQL事务隔离级别24.&nbsp;MVCC实现原理25.&nbsp;手撕算法:lc402&nbsp;移掉k位数字&nbsp;-&gt;&nbsp;没想到单调栈,暴力枚举了QAQ反问面试官之后,感觉我的缺点主要在于项目太过于玩具了,对于高并发什么的思考处于比较浅的地步,还有就是code-review对于call&nbsp;graph还有一些成熟的方案不怎么了解过,相当于纯demo,面过几场才知道QAQ,估计是没啥希望了,继续沉淀了噶人们
查看25道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务