去2的幂

去2的幂

时间限制: 1 Sec   内存限制: 16 MB

题目描述

给出二个任意的正整数 N K 1<=N<=10000 0<=K<N ),然后进行如下操作:
  1 )从 N 中连续减去 2R R=0 1 2 3 ...
  2 )当剩余的数不够减时,则将其加上 K ,再重复( 1 )的操作过程。
  3 )若剩余的数为 0 时,则结束操作并输出进行减法的次数。
  4 )若存在永远不能减完的情况,则输出信息“ ERROR !”。
        例如:当 N=4 K=2 时,操作过程如下:
       1 4-1=3    20  
       2 3-2=1    21
      由于不够减,所以加 K 的值 2 ,得: N=1+2 3
       3 3-1=2  20
       4 2-2=0  21
      此时结果为 0 ,则输出: STEP=4 (表示进行了 4 次减法操作运算)
      又如:当 N=2 ,K= 1 时,操作过程如下:
       1 2-1=1  20
      由于不够下次减,所以加 K 的值 1 ,得: N=1+1=2
       2 2-1=1  20
         …………

     在这种情况下,永远不能减完,则输出信息“ERROR!”

输入

一行,两个整数 N K。

输出

一个整数或‘ERROR’。

样例输入

4 2

样例输出

4

我的代码:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int n,k,count=0,sum=0;
	cin >> n >> k;
	while (n!=0)
	{
		if (n-(1<<count)<0)
		{
			n+=k;
			sum+=count;
			count=0;
		}
		if (!(n&1)&&k&1)
		{
			cout << "ERROR" << endl;
			return 0;
		}
		n-=(1<<count);
		count++;
	}
	cout << sum+count << endl;
	return 0;
}

标程:
#include <iostream>
 
using namespace std;
 
int main( void )
{  
    int n, k;
    cin >> n >> k;
 
    bool have[ 10001 ] = { 0 }, noover = false;
    have[ n ] = true;
 
    int s, step = 0;
    while( true )
    {
        have[ n ] = true;
        s = 1;
        while( n >= s )
        {
            n -= s;
            step ++;
            s <<= 1;
        }
 
        if( !n ) break;
         
        n += k;
        if( have[ n ] )
        {
            noover = true;
            break;
        }       
    }
 
    if( noover )
        cout << "ERROR" << endl;
    else
        cout << step << endl;
 
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值