热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SWUST.OJ#274:函数求值

目录题目题目分析代码演示递归代码循环代码题目题目分析首先啊,我们来理解一下这个题目是什么意思呢?多组输入,每组会输入一个数n&

目录

题目

题目分析

代码演示

递归代码

循环代码




题目


题目分析

首先啊,我们来理解一下这个题目是什么意思呢?多组输入,每组会输入一个数n,对应会输出一个值并换行,那这个值是什么呢?也就是f(n)的值,而f(n)又是由什么组成的呢?它的值应该等于g(1)+....+g(n),那函数g(n)的意思是什么呢?题目中定义函数g(n)为n的最大奇数因子。我们很容易就脑海里面出现了一个想法,如果n是奇数那么g(n)的值便等于n,如果n是偶数,那么就对n一直除以2,一直到剩下的数是奇数,假设这个数是m吧,那么g(n)就应该等于m,然后把g(1)到g(n)都进行这个操作,并把他们的返回值加起来,就是最后的结果,这个思路是没有问题的,但是这是典型的暴力行为。

我提出以下两点问题:


  • 如果n取最大值10的8次方,我们不妨先把g(1)+g(3)+...+g(10^8-1)奇数项加起来,看看是多少,这是多少呢?1+3+5+...+10^8-1应该等于(10^16)/4(等差数列求和)肯定是超过了int的范围的,int的范围是-2^31~2^31-1,而long long的数据范围为-2^63~2^63-1所以在定义储存结果数据的变量时,应该使用long long去定义,int与long long的参数如下:

所以我们应该知道,int数据范围的上界,应该是大于2*10^9次方的,而long long数据范围的上界,应该是大于9*10^18次方的,那是不是以后我们定义变量的时候都用long long呢?我的回答是:"NO!",定义一个long long类型的变量必然会占用更多的内存资源,作为一名优秀的程序员应该懂得合理的利用系统的内存资源,一味的图方便并不是长远之计,如果想彻底了解为什么int的数据范围是这样,long long的数据类型是那样,可以自己去了解,原码,反码,补码的内容,这里博主不做过多的阐述!


  • 我们可以设想,如果n取很大的数,就比如取10的8次方,那我们就要去一个一个检测,总共次数绝对是大于10^8次方的,因为有些偶数,要检测多次,对于一个值为2^30次方的数,便要检测30次,再加上是多组测试数据,它的运行时间是肯定超过1ms的,这就是所谓的暴力解法,会报错TLE,那我们是否可以进行优化呢?答案是:"YES!",我们看下面的分析:

f(n) = 所有奇数项之和 + 所有的偶数项,除以2

所有的偶数项除以2 = 当前所有奇数项之和 + 当前所有的偶数项除以2

一直反复下去,直到n为1

举例:f(8) = 1 + 3 + 5 + 7 + g(2/2) + g(4/2) + g(6/2) + g(8/2)

           f(4) = g(1) + g(2) + g(3) + g(4) = 1 + 3 +g(2/2) + g(4/2)

           f(2) = g(1)+ g(2) = 1 +g(2/2)

           f(1) = g(1) = 1 

补充(等差数列求和):

当n为奇数,公差为2时,sum = (1+n)*(1+n)/4

当n为偶数,公差为2时,   sum = n*n/4


代码演示


递归代码

#include
long long f(long long n)
{if(n==1) return 1;else if(n%2!=0) return (n+1)*(n+1)/4+f(n/2);else return n*n/4+f(n/2);
}
int main()
{long long n;while(scanf("%lld",&n)!=EOF){printf("%lld\n",f(n));}return 0;
}

循环代码

#include
int main()
{long long n;while(scanf("%lld",&n)!=EOF){long long sum=0;while(n!=0){if(n%2!=0) sum+=(n+1)*(n+1)/4;else sum+=n*n/4;n/=2;}printf("%lld\n",sum);}return 0;
}

此篇博客主要是面向编程初学者的,故全文采用的是纯C语言编写,有疑问欢迎大家评论区留言!!!


推荐阅读
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
author-avatar
xmli
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有