ATM (负二进制)

2024-01-17 21:38
文章标签 二进制 atm

本文主要是介绍ATM (负二进制),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

Problem Description


在一个银行的大厅里有30个自动柜员机,编号分别为0..29,每个会员顾客都能通过这些柜员机提取10^9 ducats(一种早期的流通硬币单位)的借款业务,但必须在一个星期内还是通过这些柜员机完成还款业务。这种柜员机很特别,每个柜员机只能完成一种简单的动作:供客户提取固定数目的现金或接受客户固定数目的还款。第i个柜员机只能提供2^i ducats的借款业务,如果i是偶数的话;而如果i是奇数的话,则第i个柜员机只能提供2^i ducats的还款业务。
现在,如果有一个客户想要用这些柜员机借一定数目的钱,但是每个柜员机都只能使用一次,那么,他该使用哪些柜员机呢?
一个星期内还款时,他又该使用哪些柜员机呢?
比如,他要借7 ducats,则他会从4号柜员机拿到16 ducats,从0号柜员机拿到1 ducats,再到3号柜员机还掉8 ducats,到1号柜员机还掉2 ducats。
一个星期内还款时,他会到3号柜员机先还掉8 ducats,再到0号柜员机拿到1 ducats。
请你编写一个程序,当一个客户借款,告诉他该使用哪些柜员机,以后还款时又该使用哪些柜员机。

Input

第一行为整数N(N<=1000),表示客户的数目。下面有N行,每行为一个正整数,表示每个客户要借多少钱。注意:每个客户最多能借10^9 ducats。

Output

共2N行,第2i-1行表示客户i借款时该使用哪些柜员机,第2i行表示客户i还款时该使用哪些柜员机(1<=i<=N),每行都要求按柜员机编号从大到小输出,每个编号之间用1个空格隔开。
如果业务无法成交,则输出NIE。

Sample Input

2
7
385171980

Sample Output

4 3 1 0
3 0
NIE
29 28 27 24 20 19 18 17 16 15 14 9 5 4 2

 

所谓的负二进制:3=4-2+1.    7=16-8+0*4-2+1.

这道题目就是问输入一个数字n,分别求n和-n的负二进制表示。

就拿3来说,3%2=1,所以0位是1,然后-3/2=-1,  -1%2是1,所以1位是1,  然后 值得注意的地方是   -1不能跟刚才一样处理,要不会得到3位是0的错误结果。

应该是(-1*1+1)/2  。

-n的处理一样。

 

#include<cstdio>
#include<iostream>
using namespace std;int main()
{int t;int i;int num[40];int n,temp;cin>>t;while(t--){cin>>n;temp=n;for(i=0;temp!=0;i++){num[i]=temp%2;if(num[i]<0)num[i]=-num[i];if(temp<0&&temp%2!=0)temp=(-temp+1)/2;elsetemp=-temp/2;}i--;if(i>=30){cout<<"NIE"<<endl;}else{cout<<i;for(i--;i>=0;i--)if(num[i]!=0)printf(" %d",i);cout<<endl;}temp=-n;for(i=0;temp!=0;i++){num[i]=temp%2;if(num[i]<0)num[i]=-num[i];if(temp<0&&temp%2!=0)temp=(-temp+1)/2;elsetemp=-temp/2;}i--;if(i>=30){cout<<"NIE"<<endl;}else{cout<<i;for(i--;i>=0;i--)if(num[i]!=0)printf(" %d",i);cout<<endl;}}return 0;
}


 

这篇关于ATM (负二进制)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617299

相关文章

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

通信工程学习:什么是2ASK/BASK二进制振幅键控

2ASK/BASK:二进制振幅键控         2ASK/BASK二进制振幅键控是一种数字调制技术,其全称是二进制振幅键控(Binary Amplitude Shift Keying)。该技术通过改变载波的振幅来传递二进制数字信息,而载波的频率和相位则保持不变。以下是关于2ASK/BASK二进制振幅键控的详细解释: 一、2ASK/BASK二进制振幅键控的基本原理 1、振幅键控:

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil

二进制的匹配问题

最近做了点搜索和背包的题目,发现这个二进制的匹配很是好用,所以写一篇二进制的匹配来作为自我总结; 首先我们要知道二进制的运算符,和他们的运算规则; ABA&BA|BA^B00000010111001111110 运算符有三种‘&’ , ‘|’ ,  ‘^'  或,且,异或,运算的规则在表中可以看到,想想这个规则我们可以做很多事情! 首先,每个十进制的数都会对应一个唯一的二进

二进制方式安装Helm

二进制方式安装Helm 官网:https://helm.sh/ 1、下载安装包 wget -L https://get.helm.sh/helm-v3.16.0-rc.1-linux-amd64.tar.gz 2、解压 tar -xf helm-v3.16.0-rc.1-linux-amd64.tar.gz 3、移动到/usr/local/bin/目录下 mv linux-am

输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。

/*** 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。* 思路:第一步求这两个数的异或,第二步统计异或结果中1的位数*@author: Administrator*@date: 2017-1-13 下午09:39:25*/import java.util.Scanner;public class Solution4 {public int CountDifference

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

Java 二进制,八进制,十进制,十六进制之间的相互转换

package com.sjd.JinzhiZhuanhuan;public class JinzhiZhuanhuan {//二进制转八,十,十六进制---开始public void fromBinaryToOctalSting(String str1) {String result=Integer.toOctalString(Integer.parseInt(str1, 2));System.

JAX-WS - 二进制处理之MTOM(文件上传)

一、一般模式     服务端: import javax.jws.WebService;@WebServicepublic interface UploadService {public void upload(byte[] file);} import java.io.File;import java.io.FileOutputStream;import java.io.IOEx