oj1610: 菲波那契数

斐波那契数列计算
本文介绍了一种使用递归算法计算斐波那契数列的方法,并提供了一个C语言实现的例子。该程序能够接收一系列正整数作为输入,输出对应的斐波那契数列值。
问题描述:菲波那契(fibonacci)数(简称菲氏数)定义为: f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2). n>1的整数如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 ...
如果求其第6项,则应为8。求第n项菲氏数
作者:何知令
发表时间:2017年2月17日
输入:输入数据含有不多于50个的正整数n(0≤n≤46)。

输出:对于每个n,计算其第n项菲氏数,每个结果应占单独一行。

代码:

/*
问题描述:菲波那契(fibonacci)数(简称菲氏数)定义为: f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2). n>1的整数如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 ...
如果求其第6项,则应为8。求第n项菲氏数
作者:何知令
发表时间:2017年2月17日
输入:输入数据含有不多于50个的正整数n(0≤n≤46)。
输出:对于每个n,计算其第n项菲氏数,每个结果应占单独一行。
*/
#include <stdio.h>
#include <stdlib.h>
int fib(int num)
{
    if(num==0)
        return 0;
    else if(num==1)
        return 1;
    else
        return fib(num-1)+fib(num-2);
}
int main()
{
    int num;
    while(scanf("%d",&num)!=EOF)
        printf("%d\n",fib(num));
    return 0;
}
程序运行结果展示:

知识点总结:函数,递归

学习心得;著名的斐波那契数列,拿出来充数


<think>好的,我现在需要解决用户的问题,关于OJ平台题目1621“公共的”的解题思路或代码实现。首先,我得先明确题目要求。根据用户提供的引用内容,虽然引用的几个文献是关于其他题目或内容的,比如快速排序、孪生素、回文、线段相交等,但题目1621的标题是“公共的”,可能涉及到寻找公共元素的问题。 首先,我应该回忆常见的“公共”类题目的常见解法。例如,可能要求找出两个组中的公共元素,或者多个集合的交集,或者更复杂的统计问题。可能需要考虑时间复杂度和空间复杂度,尤其是当据量大的时候。 接下来,我需要假设可能的题目描述。例如,题目可能是给定两个组,找出它们的公共元素的量,或者找出所有公共的并按某种顺序输出。或者是多个组中的公共,或者需要满足特定条件的公共,比如质、回文等。 考虑到用户提供的引用中有关于华为OD机试的高频题,可能题目类似于寻找两个有序组的公共元素,或者需要高效算法处理大据的情况。例如,给定两个大组,如何快速找到它们的公共元素,这种情况下可能需要使用双指针法,或者哈希表的方法。 如果题目是求两个组的公共元素,那么可能的解法有两种:哈希表法或双指针法。哈希表法适用于无序组,时间复杂度O(n+m),空间复杂度O(n)。双指针法则需要组有序,时间复杂度O(n+m),空间复杂度O(1)。 假设题目中的据规模较大,比如组长度达到1e5或更高,那么双指针法可能更优,因为哈希表的空间可能不足。但如果是较小的据规模,哈希表可能更简单。 例如,假设题目描述是:给定两个升序排列的组,找出它们的公共元素,并输出这些公共元素。此时,双指针法是合适的。初始化两个指针分别指向两个组的起始位置,比较当前元素,若相等则加入结果,并同时移动两个指针;若不等,移动较小元素的指针,直到其中一个组遍历完毕。 如果题目中的组是无序的,那么可能需要先排序,再使用双指针,但这样时间复杂度为O(n log n + m log m),或者使用哈希表存储一个组的元素,然后遍历另一个组,检查是否存在于哈希表中,这样时间复杂度O(n + m),但空间复杂度O(n)。 另外,如果题目中的“公共的”需要满足其他条件,比如是素或回文,那么可能需要先筛选出符合条件的,再找公共部分。例如,引用中的孪生素问题,需要先判断素,再检查相邻的素对。 但根据题目编号1621和标题“公共的”,可能更偏向于基本的公共元素查找。例如,用户可能遇到的是类似于LeetCode中的Intersection of Two Arrays的问题。这种情况下,可能的解法是使用集合的交集操作。 但需要考虑题目的具体要求,比如是否需要去重,输出顺序,或者元素出现的次。例如,某些题目要求输出所有公共元素,包括重复次,而另一些可能只要求输出一次。 现在,我需要检查用户提供的引用内容是否有相关线索。引用[2]提到孪生素的统计,引用[3]关于回文的判断,引用[4]关于线段相交的判断。这些可能与当前问题无关,但引用[1]提到华为OD的高频题,其中可能包含类似公共的题目。 假设题目1621类似于:给定两个组,找出它们的公共元素的量,并按升序输出。那么代码实现可能如下: 对于无序组,使用哈希表: def find_common(nums1, nums2): set1 = set(nums1) set2 = set(nums2) return sorted(set1 & set2) 时间复杂度O(n + m),空间O(n + m)。 如果组已经有序,可以用双指针: def find_common(nums1, nums2): i = j = 0 res = [] while i < len(nums1) and j < len(nums2): if nums1[i] == nums2[j]: # 去重处理,如果前一个元素相同则跳过 if not res or nums1[i] != res[-1]: res.append(nums1[i]) i += 1 j += 1 elif nums1[i] < nums2[j]: i += 1 else: j += 1 return res 但需要处理重复元素的情况,比如题目是否允许重复的公共元素。如果组本身可能有重复元素,且需要统计所有重复的情况,那么处理会更复杂,可能需要记录出现次,使用哈希表统计频率。 例如,1为[2,2,3], 组2为[2,2,4],公共元素应该是两个2。此时,哈希表方法可以统计每个元素出现的次,取较小值: from collections import defaultdict def find_common_with_count(nums1, nums2): count = defaultdict(int) for num in nums1: count[num] +=1 res = [] for num in nums2: if count[num] >0: res.append(num) count[num] -=1 return res 这种情况下,返回的公共元素包括重复的情况,每个元素出现的次是两个组中的最小次。 但具体实现需要根据题目要求调整。例如,是否需要输出所有公共元素(包括重复),或者每个公共元素只输出一次。 如果题目中的“公共的”指的是两个组中至少各出现一次的,不管次,那么使用集合的交集即可。但如果要求出现的次也要匹配,则需要更复杂的处理。 现在,假设用户的问题是关于OJ 1621的具体题目,但用户无法提供题目描述,我需要基于常见情况给出可能的解题思路。 可能的思路步骤: 1. 确定题目具体要求:输入是两个组还是多个组?是否需要统计量还是输出具体值?是否需要有序输出? 2. 根据输入规模选择合适的据结构和算法。例如,据量大的情况下,使用O(n)时间复杂度的算法;若允许空间消耗,哈希表法更高效;如果组有序,双指针法更优。 3. 处理可能的重复元素情况,是否需要考虑元素出现的次。 4. 编写代码,注意边界条件,例如空组,无公共元素的情况。 可能的代码实现(假设是求两个组的交集,元素唯一): Python示例: def common_numbers(arr1, arr2): set1 = set(arr1) set2 = set(arr2) common = set1 & set2 return sorted(common) # 输入处理部分需要根据题目具体要求编写 或者,如果需要处理重复元素: from collections import Counter def common_numbers_with_duplicates(arr1, arr2): count1 = Counter(arr1) count2 = Counter(arr2) common = [] for num in count1: if num in count2: common.extend([num] * min(count1[num], count2[num])) return sorted(common) 但具体输出格式需要根据题目调整。 另外,如果题目中的“公共的”是指多个的公共因,或者其他学属性,可能需要不同的方法。例如,求两个的最大公约,或者一组的公共因子。但根据题目名称,可能性较低。 总结:由于没有具体的题目描述,只能基于常见情况给出可能适用的解题思路。建议用户提供更多题目细节,或参考OJ平台上的题目描述,以便给出更精确的解答。</think>### OJ 1621 公共的 解题思路 根据题目名称及常见题型分析,"公共的"通常要求找出多个集合中共同存在的元素。这里假设题目为**求两个组的交集并按升序输出**,以下是两种典型解法: --- #### 方法一:哈希表法(适用于无序组) 1. **时间复杂度**:$O(m + n)$ 2. **空间复杂度**:$O(m)$ 3. **步骤**: - 将第一个组存入哈希表。 - 遍历第二个组,检查元素是否存在于哈希表中。 - 去重后按升序输出。 ```python def find_common(nums1, nums2): set1 = set(nums1) common = set() for num in nums2: if num in set1: common.add(num) return sorted(common) ``` --- #### 方法二:双指针法(适用于有序组) 1. **时间复杂度**:$O(m \log m + n \log n)$(若组无序需排序) 2. **空间复杂度**:$O(1)$(不计排序的栈空间) 3. **步骤**: - 对两个组排序。 - 使用双指针遍历,比较元素大小并记录公共值。 ```python def find_common(nums1, nums2): nums1.sort() nums2.sort() i, j = 0, 0 common = [] while i < len(nums1) and j < len(nums2): if nums1[i] == nums2[j]: if not common or nums1[i] != common[-1]: common.append(nums1[i]) i += 1 j += 1 elif nums1[i] < nums2[j]: i += 1 else: j += 1 return common ``` --- ### 性能优化 - **哈希表法**更适合无序组且据规模较大时[^1]。 - **双指针法**在组已有序时效率更高,避免排序开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值