题目:
L1-108 零头就抹了吧
分数 10
作者 陈越
单位 浙江大学
这是知乎上看到的:前几天去肉店灌香肠,结账一共258元。我说:“都是老顾客了,零头就抹了吧。”老板也很爽快:“行,凑个整,你给256块吧。”我顿时肃然起敬:“您以前当过程序员吧?在哪个公司啊?”老板看了看我,有点不好意思地说:“XX”。
本题就请你写个程序,帮老板计算他怎么抹零头。
输入格式:
输入在一行中给出一个正整数 N(≤109),为客人应该付的钱。
输出格式:
在一行中输出老板抹掉零头后应收的钱。
输入样例:
258输出样例:
256样例说明:
256 在二进制中是 100 000 000,被程序员认为是个很“整”的数。所有二进制中最高位是 1 后面全是 0 的数字都是程序员世界里的“整”数。256 是小于 258 的最大的“整”数,所以老板收取这个数。
我的想法:
样例说明给了很重要的信息,“所有二进制中最高位是 1 后面全是 0 的数字都是程序员世界里的“整”数”,也就是说,二进制表示1,10,100,1000,,,是“整数”,其实换成十进制,就是2的倍数。
我先把2^0到2^31次方的取整结果先算出来,然后计算当前的取整结果对应输出哪个就好了。计算对应取余结果时,就一直把原数除以2,看一共能除多少次,其实就是类比十进制转二进制的方法。其实在这一题中,也可以不必把2^0到2^31全计算出来,我只是觉得要是有多个输出的话,这样的方法可以节省时间
实现代码:
#include <iostream> using namespace std; int a[40]; void func(){ a[0]=1; for(int i=1;i<=31;i++){ a[i]=2*a[i-1]; } } int getr(int x){ int ans=0; while(x){ x/=2; ans++; } return a[ans-1]; } int main() { func(); int n=0;cin>>n; int ret=getr(n); cout<<ret<<endl; return 0; }