一道思维题 &&递归改循环

思路:

比如5 2

12345--> 1245 从3开始,这时候5变成了1.剩下4512,对应1234.只需要找到现在n-1,k中的数对应原来的编号的映射。比如1-->3 是1+2 mod 5,4-->1是4+2 mod 5.

这就形成了递归。

这样递归到最后剩一个数,结果就是这个数。

这样的问题是mod n后从0开始,

解决办法1:返回时+1

#include <iostream>

using namespace std;

int A(int n, int k) {

    if ( n == 1){
        return 1;
    }
    else{
        return (A(n-1,k)+k)%n+1;
    }

}

int main()
{
    int n, k;
    while (true)
    {
       cin >> n;
    cin >> k;
    cout << A(n,k);
    }

    system("pause");
    return 0;
}

解决办法2:将所有数-1,最后加一

#include <iostream>

using namespace std;

int A(int n, int k) {

    if ( n == 1){
        return 0;
    }
    else{
        return (A(n-1,k)+k)%n;
    }

}

int main()
{
    int n, k;
    cin >> n;
    cin >> k;
    cout << A(n,k+1) + 1;
    return 0;
}

这样栈会溢出(n很大的时候)

改成循环(解法2)

#include <iostream>

using namespace std;

int A(int n, int k) {

   
    int ans=0,s=1;
    while(s<n){
        s++;
        ans=ans+k;
        ans=ans%s;
    }
    return ans;

}

int main()
{
    int n, k;
    cin >> n;
    cin >> k;
    cout << A(n,k+1) + 1;
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/lqerio/p/12093801.html

时间: 2024-10-17 06:32:00

一道思维题 &&递归改循环的相关文章

递归改循环

递归需要保存现场,所以会导致栈不断加深.因此如果改循环,那么也需要创建栈来保存现场. 书写递归函数时,递归函数的退出是由于不满足递归条件而导致的,但从结果上来看即是现场的退出.因此改为循环时,循环条件可以是现场数量是否为0,即栈元素是否为零. 进入一次递归函数可以看成是入栈,退出一次递归函数则是出栈. 可以根据形参的数量创建相应数量的栈,各个栈用于保存相应的形参.如果形参中包含这样的参数——该参数代表的内存贯穿整个递归——那么该参数可以不放入栈元素中. 递归函数体即为循环体.

【每天一道算法题】整数循环节之和——数字黑洞6174

华为优招第三题,前两道题都比较简单,在这道题上卡住了.说实话不怪我,华为这道题描述有问题哦.其实不应该是较大的数,和较小的数.是最大的数和最小的数.(我在随机举例可能的数字组合上浪费了很多时间!!怒!) 整数之循环节点求和 描述: 任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时在前面补零,类推下去,最后将变成一个固定的数:6174. 例如:4321-1234=3087 8730-378=8352 853

hdu2094—看似拓扑实际上是一道思维题

HDU2094  产生冠军 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094 题意:中文题,就不解释了.题意已经非常清楚了. 这道题的看起来像是一个拓扑排序的问题实际上拓扑感觉做不了,可能可以做了吧?但是我没想到,估计也比较麻烦吧.这里介绍一种比较简单的做法,就是一种思维,如果存在冠军(所有人都可以被他打败),这个人肯定没有败过,而其他人都败过,所以我们只需要确定所有人的人数,和败者的人数(去重以后,所以需要用set,因为一个败者会败给多个人

Report,又是一道思维题

题目: Each month Blake gets the report containing main economic indicators of the company "Blake Technologies". There are n commodities produced by the company. For each of them there is exactly one integer in the final report, that denotes corres

Aaronson 一道思维题

中文题目链接 Recently, Peter saw the equation x0+2x1+4x2+...+2mxm=nx0+2x1+4x2+...+2mxm=n. He wants to find a solution (x0,x1,x2,...,xm)(x0,x1,x2,...,xm) in such a manner that ∑i=0mxi∑i=0mxi is minimum and every xixi (0≤i≤m0≤i≤m) is non-negative. InputThere

迭代、递归替代循环

循环(迭代)与递归的区别 1. 递归算法与迭代算法的设计思路区别在于:函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法. 当然,从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的. 但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样.这也是为什么在结构设计时,通常采用递

一天一道算法题---5.24.--递归

感谢 微信号---code4god  这是他们的微信平台  每日会提供一道算法题   我只是个搬运工 我们每一天都应该比昨天更强一点 观察下列式子:12 = 12*1 12 = 6*212 = 4*312 = 3*412 = 3*2*212 = 2*612 = 2*3*212 = 2*2*3对于给定的n 计算n公有多少种不同的分解式? 1 #include <iostream> 2 using namespace std; 3 4 int cnt;//记录拆分次数 5 void slove(

Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E. Excellent Engineers-单点更新、区间最值-线段树 G. Growling Gears I. Interesting Integers-类似斐波那契数列-递推思维题

先写这几道题,比赛的时候有事就只签了个到. E. Excellent Engineers 传送门: 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到名单中. 因为是3个变量,所以按其中一个变量进行sort排序,然后,剩下的两个变量,一个当位置pos,一个当值val,通过线段树的单点更新和区间最值操作,就可以把名单确定. 代码: 1 //E-线段树 2 #include<iostream> 3 #include<cstdio> 4 #incl

一天一道算法题---6.26---二分查找

感谢微信平台---一天一道算法题----每天多一点进步-- 好累啊  现在在用win7自带的输入法 打起来真麻烦 快点把这2天的搞完就重装了 还是直接来源于----〉 待字闺中 分析 给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.