首页 > 试题广场 > 扭蛋机
[编程题]扭蛋机
22娘和33娘接到了小电视君的扭蛋任务:
一共有两台扭蛋机,编号分别为扭蛋机2号和扭蛋机3号,22娘使用扭蛋机2号,33娘使用扭蛋机3号。
扭蛋机都不需要投币,但有一项特殊能力:
扭蛋机2号:如果塞x(x范围为>=0正整数)个扭蛋进去,然后就可以扭到2x+1个
扭蛋机3号:如果塞x(x范围为>=0正整数)个扭蛋进去,然后就可以扭到2x+2个
22娘和33娘手中没有扭蛋,需要你帮她们设计一个方案,两人“轮流扭”(谁先开始不限,扭到的蛋可以交给对方使用),用“最少”的次数,使她们能够最后恰好扭到N个交给小电视君。

输入描述:
输入一个正整数,表示小电视君需要的N个扭蛋。


输出描述:
输出一个字符串,每个字符表示扭蛋机,字符只能包含"2"和"3"。
示例1

输入

10

输出

233

备注:
1<=N<=1e9
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
            while(sc.hasNext()){
                int num = sc.nextInt();
                StringBuilder res = new StringBuilder();
                while(num != 0){
                    if(num % 2 == 0){
                        num = (num - 2) / 2;
                        res.insert(0, "3");
                    }else{
                        num = (num - 1) / 2;
                        res.insert(0, "2");
                    }
                }
                System.out.println(res);
            }
    }
}
发表于 2019-06-23 12:32:36 回复(0)
✭头像
x = eval(input())
ls = []
while(x):#从后往前逆推
    if(x%2==0):#若x为偶数,则最后一步肯定是扭蛋机3
        ls.append(3)
        x = (x-2)/2
    else:#若x为奇数,则最后一步肯定是扭蛋机2
        ls.append(2)
        x = (x-1)/2
for i in ls[::-1]:
    print(i, end='')

发表于 2019-08-26 21:52:08 回复(3)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,x=0;
    cin>>n;
    string s="";
    while(n)
    {
        if(n%2==0)
        {
            n=(n-2)/2;
            s+='3';
        }
        else
        {
            n=(n-1)/2;
            s+='2';
        }
    }
    reverse(s.begin(),s.end());
    cout<<s<<endl;
    return 0;
}

发表于 2019-07-23 08:28:14 回复(0)
def helper(num):
    res = ""
    while num>0:
        if ((num-2)/2)%1==0:
            res = '3'+res
            num = (num-2)/2
        if ((num-1)/2)%1==0:
            res =  '2'+res
            num = (num-1)/2
    return res
if __name__ == "__main__":
    obj = int(input())
    ans = helper(obj)
    print(ans)

发表于 2019-05-07 13:37:44 回复(3)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    string s="";
    while(n){
        if(n%2==0){
            n = (n-2)/2;
            s += '3';
        }else{
            n = (n-1)/2;
            s += '2';
        }
    }
    reverse(s.begin(), s.end());
    cout<<s<<endl;
    return 0;
}

发表于 2019-09-20 08:46:47 回复(0)
// golang
package main
 
import (
    "fmt"
)
func main()  {
    var niudan int
    fmt.Scanln(&niudan)
    var fanan  []int
    ifniudan == 1 {
        fmt.Printf("%d", 2)
    }elseifniudan == 2 {
        fmt.Printf("%d", 3)
    }else{
        for{
            ifniudan % 2 == 0 {
                niudan = (niudan - 2) / 2
                fanan = append(fanan, 3)
 
            } else{
                niudan = (niudan - 1) / 2
                fanan = append(fanan, 2)
            }
            ifniudan == 0 {
                break
            }
        }
        fori := len(fanan) - 1; i >= 0; i -- {
            fmt.Printf("%d", fanan[i])
        }
    }
}
发表于 2019-09-10 12:36:04 回复(0)
n = int(input())
o = []
while n:
    o.append('3' if n%2 == 0 else '2')
    n = (n-1)//2
print(''.join(o[::-1]))

发表于 2019-09-09 15:52:50 回复(0)
#include <iostream>
#include<string>
usingnamespacestd;
intmain() {
    intresult;
    string s = "";
    cin>>result;
    while(result!=0)
    {
        if(result%2==0)
        {
            result=(result-2)/2;
            s="3"+s;
        }
        else
        {
            result=(result-1)/2;
            s="2"+s;
        }
    }
    cout<<s<<endl;
    return0;
}
发表于 2019-08-31 16:00:21 回复(0)
这道题可以简化成走方格
初始位置是x=0,然后每步有两种选择
1、第一种选择是走到编号为 2*x+1 的方格,代号为 ‘2’
2、第一种选择是走到编号为 2*x+2 的方格,代号为 ‘3’
求一种可以正好走到 编号为 n 的方式
# 逆推法:根据最后一步的奇偶,判断前一步的选择
n = int(input())
res = ''
while n > 0:
    if (n-2) % 2:
        n = (n-1) // 2
        res = '2' + res
    else:
        n = (n-2) // 2
        res = '3' + res
print(res)



发表于 2019-08-22 16:01:14 回复(0)
原来是这样的
import java.util.*;
public class bili23 {
	public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        StringBuffer str = new StringBuffer();
        while(n > 0) {
            if(n%2 == 0) {
            	n = (n - 2)/2;
            	str.append("3");
            }else {
            	n = (n - 1)/2;
            	str.append("2");
            }
        }
        str.reverse();
        System.out.println(str);
        sc.close();
    }
}

发表于 2019-08-10 15:51:36 回复(0)
#include <iostream>
#include <stack>
#include <string>

using namespace std;

int N;
stack<string> s_sta, t_sta;

bool dfs(int, int);

int main(int argc, char **argv) {
    cin >> N;
    if (dfs(0, 0)) {
        for (; !s_sta.empty(); t_sta.push(s_sta.top()), s_sta.pop());
        for (; !t_sta.empty(); cout << t_sta.top(), t_sta.pop());
    }
    cout << endl;
    return 0;
}

bool dfs(int i, int sum) {
    if (sum == N) return true;
    if (sum > N) return false;
    for (int j = sum; j >= 0; j--) {
        s_sta.push("3");
        if (dfs(i + 1, sum - j + (2 * j + 2))) return true;
        s_sta.pop();
    }
    for (int j = sum; j >= 0; j--) {
        s_sta.push("2");
        if (dfs(i + 1, sum - j + (2 * j + 1))) return true;
        s_sta.pop();
    }
    return false;
}
# 这题本身充满了问题
(1)“x范围为>=0正整数”,x到底tm能不能为0?题目后半部分印证了“x为 >= 0的整数”。
(2)同样次数最少的情况下,串到底是否唯一?从题目来看,并不要求唯一;从样例来看,要求唯一。
# 我的答案的问题
(1)我采用的dfs并不是一个好办法,大家的根据奇偶判断的方法更合适,但我认为不应该是错的。
发表于 2019-08-03 10:51:31 回复(2)
这是什么意思啊。。。
发表于 2019-05-11 18:35:08 回复(0)
# 递归方法
N = int(input())
order = ''
def egg(N, _order):
    if(N == 0):
        return _order
    elif(N%2 == 0):
        N = (N-2)/2
        _order = egg (N, _order)+'3'
        return _order
    else:
        N = (N-1)/2
        _order = egg (N, _order)+'2'
        return _order
order = egg(N, order)
print(order)

# 普通方法
N = int(input())
order = ''
while(N!=0):
    if(N%2 == 0):
        order = '3' + order 
        N = (N-2)/2
    else:
        order = '2' + order
        N = (N-1)/2
print(order)

发表于 2019-10-11 19:24:32 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    stack<int> st;
    cin>>n;
    while(n){
        if(n&1){
            n=(n-1)>>1;
            st.push(2);
        }
        else{
            n=(n-2)>>1;
            st.push(3);
        }
    }
    while(!st.empty()){
        cout<<st.top();
        st.pop();
    }
    return 0;
}

发表于 2019-09-19 16:15:14 回复(0)
importjava.util.Scanner;
publicclassMain{
    publicstaticvoidmain(String[] args) {
        Scanner scanner=newScanner(System.in);
        inta=scanner.nextInt();
        System.out.println(getValue(a));
    }
    publicstaticString getValue(inta){
            if(a==0){
                return"";
            }else{
                String string = "";
                String news = "";
                while(a - 1>= 0) {
                    if((a - 1) % 2== 0) {
                        string += "2";
                    } else{
                        string += "3";
                    }
                    a = (a - 1) / 2;
                }
                for(inti = string.length(); i > 0; i--) {
                    news += string.substring(i - 1, i);
                }
                returnnews;
            }
        }
}
发表于 2019-09-17 20:38:15 回复(0)
import java.util.*;
public class Main{
    public static StringBuffer niudan(int n ){
        String c = "" ;
        while(n!=0){
        if ( n%2==0 ){ 
            n=(n-2)/2;
            c+="3";
        }
        else {
            n=(n-1)/2;
            c+="2";
        }
        }
        StringBuffer str = new StringBuffer(c);
        return str;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N;
        StringBuffer str = new StringBuffer("");
        N=sc.nextInt();
        str=niudan(N);
        System.out.println(str.reverse());
    }
}
发表于 2019-09-10 09:50:31 回复(0)
go语言
package main

import (
	"fmt"
	"strings"
)

func main() {
	var count int
	str := make([]string, 0)
	fmt.Scanln(&count)
	for count > 0 {
		switch {
		case (count-1)%2 == 0:
			str = append(str, "2")
			count = (count - 1) / 2
		case (count-2)%2 == 0:
			str = append(str, "3")
			count = (count - 2) / 2
		}
	}
	n := len(str)
	for i := 0; i < (n+1)/2; i++ {
		str[i], str[n-1-i] = str[n-1-i], str[i]
	}
	fmt.Println(strings.Join(str, ""))
}


发表于 2019-09-09 20:01:45 回复(0)
哪位老哥解释一下 轮流扭 为啥答案是 233?
发表于 2019-09-09 17:20:43 回复(2)
n = int(input())
ret = []
while n > 0:
    if n % 2 == 0:
        ret.append("3")
    else:
        ret.append("2")
    n = (n - 1) // 2
print("".join(ret[::-1]))


发表于 2019-09-03 05:49:17 回复(0)
#include <iostream>
#include <string>
using namespace std;
void Process(int n)
{
    string result = "";
    while((n != 1) && (n != 2))
    {
        if((n % 2) != 0 )
        {
            //单数情况
            n = (n-1)/2;
            result += "2";
        }else
        {
            n = (n-2)/2;
            result += "3";
        }       
    }
    if(n == 1)
    {
        result += "2";
    }else if(n == 2)
    {
        result += "3";
    }
    string R_result = "";
    for(int i=result.size()-1;i>=0;i--)
    {
        R_result += result[i];
    }
    cout<<R_result;
}

int main()
{
    int n = 0;
    cin>>n;
    Process(n);
}



发表于 2019-09-01 14:07:05 回复(0)

热门推荐

通过挑战的用户

查看代码