Divide by three, multiply by two

Polycarp喜欢玩数字。 他取一些整数x,写在黑板上,然后执行两种运算:
将数字x除以3(x必须可以被3整除);
将数字x乘以2。
你的问题是重新排序这个序列的元素,使得它可以匹配上述规则。即 每个下一个数字将是前一个数字的两倍,或者是前一个数字的三分之一。

保证答案的存在。
Input
输入的第一行包含整数n(2≤n≤100) - 序列中元素的数量。 输入的第二行包含n个整数a1,a2,…,an(1≤ai≤3⋅1018)
Output
输出n个整数 - 重新排列后的序列,可以是原序列。

保证答案的存在。
Sample Input
Input
6
4 8 6 3 12 9
Output
9 3 6 12 4 8

Input
4
42 28 84 126
Output

126 42 84 28
Input
2
1000000000000000000 3000000000000000000

Output
3000000000000000000 1000000000000000000

/*
DFS  递归
先判断一个数是否满足两个条件
1、该数的 2 倍是否在该输入集合中( 这里用 vis 等于1 来标记在该集合中)
2、该数 除 3 是否在该集合中
如果不符合上诉条件的话,则递归 return 0 到上一级,并且让 k 减减,知道重新开始
*/
/*由于数比较大,3*10^8 ,则开 long long 
第三组样例中,超过了 int ,则 用 map 开一个 long long 型的标记数组
需要包括头文件 #include<map>
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long LL;
long long k=0,flag=0,n;
long long ans[101];
map<LL,int>vis;
long long DFS(long long int a)
{
    if(k==n-1){
        ans[k++]=a;
        return 1;
    }
    if(vis[a*2]==1){
        ans[k++]=a;
        if(DFS(a*2))
            return 1;
        k--;
    }
    if(a%3==0&&vis[a/3]==1){
        ans[k++]=a;
        if(DFS(a/3))
            return 1;
        k--;
    }
    return 0;
}
int main()
{
    long long i;
    long long c[101];
    scanf("%lld",&n);
    for(i=0;i<n;i++){
        scanf("%lld",&c[i]);
        vis[c[i]]=1;
    }
    for(i=0;i<n;i++){
        k=0;
        flag=0;
        flag=DFS(c[i]);
        if(flag==1)
            break;
    }
    for(i=0;i<n;i++){
        if(i==0)
            printf("%lld",ans[i]);
        else
            printf("% lld",ans[i]);
    }
    printf("\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于BorderLayout布局的计算器示例代码: ```java import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class Calculator extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextField text; private JButton zero, one, two, three, four, five, six, seven, eight, nine; private JButton add, subtract, multiply, divide, equals, clear; private double num1, num2; private String operator; public Calculator() { super("Calculator"); // Set up the text field text = new JTextField(); text.setEditable(false); // Set up the number buttons zero = new JButton("0"); one = new JButton("1"); two = new JButton("2"); three = new JButton("3"); four = new JButton("4"); five = new JButton("5"); six = new JButton("6"); seven = new JButton("7"); eight = new JButton("8"); nine = new JButton("9"); // Set up the operator buttons add = new JButton("+"); subtract = new JButton("-"); multiply = new JButton("*"); divide = new JButton("/"); equals = new JButton("="); clear = new JButton("C"); // Add action listeners to all buttons zero.addActionListener(this); one.addActionListener(this); two.addActionListener(this); three.addActionListener(this); four.addActionListener(this); five.addActionListener(this); six.addActionListener(this); seven.addActionListener(this); eight.addActionListener(this); nine.addActionListener(this); add.addActionListener(this); subtract.addActionListener(this); multiply.addActionListener(this); divide.addActionListener(this); equals.addActionListener(this); clear.addActionListener(this); // Set up the button panel JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 4)); buttonPanel.add(seven); buttonPanel.add(eight); buttonPanel.add(nine); buttonPanel.add(divide); buttonPanel.add(four); buttonPanel.add(five); buttonPanel.add(six); buttonPanel.add(multiply); buttonPanel.add(one); buttonPanel.add(two); buttonPanel.add(three); buttonPanel.add(subtract); buttonPanel.add(zero); buttonPanel.add(new JPanel()); buttonPanel.add(equals); buttonPanel.add(add); // Add components to the frame using BorderLayout add(text, BorderLayout.NORTH); add(buttonPanel, BorderLayout.CENTER); add(clear, BorderLayout.SOUTH); // Set frame properties setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); setVisible(true); } public void actionPerformed(ActionEvent e) { // Get the button that was clicked JButton button = (JButton) e.getSource(); // Handle number buttons if (button == zero) { text.setText(text.getText() + "0"); } else if (button == one) { text.setText(text.getText() + "1"); } else if (button == two) { text.setText(text.getText() + "2"); } else if (button == three) { text.setText(text.getText() + "3"); } else if (button == four) { text.setText(text.getText() + "4"); } else if (button == five) { text.setText(text.getText() + "5"); } else if (button == six) { text.setText(text.getText() + "6"); } else if (button == seven) { text.setText(text.getText() + "7"); } else if (button == eight) { text.setText(text.getText() + "8"); } else if (button == nine) { text.setText(text.getText() + "9"); } // Handle operator buttons else if (button == add) { num1 = Double.parseDouble(text.getText()); operator = "+"; text.setText(""); } else if (button == subtract) { num1 = Double.parseDouble(text.getText()); operator = "-"; text.setText(""); } else if (button == multiply) { num1 = Double.parseDouble(text.getText()); operator = "*"; text.setText(""); } else if (button == divide) { num1 = Double.parseDouble(text.getText()); operator = "/"; text.setText(""); } else if (button == equals) { num2 = Double.parseDouble(text.getText()); if (operator.equals("+")) { text.setText("" + (num1 + num2)); } else if (operator.equals("-")) { text.setText("" + (num1 - num2)); } else if (operator.equals("*")) { text.setText("" + (num1 * num2)); } else if (operator.equals("/")) { if (num2 == 0) { text.setText("Error"); } else { text.setText("" + (num1 / num2)); } } } else if (button == clear) { text.setText(""); } } public static void main(String[] args) { new Calculator(); } } ``` 这个计算器使用BorderLayout布局,将文本框放在北部,按钮面板放在中间,清除按钮放在南部。按钮面板使用GridLayout布局,以4行4列显示数字和操作符按钮。每个按钮都添加了一个ActionListener,以便在单击时执行相应的操作。这个计算器可以处理加法、减法、乘法和除法运算,以及清除当前输入和显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值