把2移至前方,数字立刻变成两倍

原创 2004年07月01日 12:26:00

论坛上有人出了这样一道,求一个数,这个数的个位数是2,当把个位上的2移动到最高位的前面时,这个数即为原数的两倍。

一开始我用循环穷举,无果,估计此数可能非常巨大。分析算法后发现可以简化为:

#include <iostream>
using namespace std;
int main( void )
{
 __int64 a = 1, b = 2;
 int p;
 while ( true )
 {
  if ( ( p = (int)( a - ( a / 10 ) * 10 ) ) == 2 && b % a == 0 )
  {
   cout << a << endl;
   break;
  }
  a = ( b = b * 10 + p ) / 2;
 }
 system( "pause" );
 return 0;
}
算法详解如下:

设a为待求值,另有整数b,使得b的值等于a的个位移移动到最高位所得的值,并且a满足两个条件:
1. a的个位数为2
2. b = 2a

算法
E1. 初始a为1,b为2

E2. 求得a的个位数,并赋值予p

E3. 如果p = 2说明a满足该数的第一个条件,如果b能整除a,则满足该数的第二个条件,那么,求得该数,输出结果,退出程序。

E4. 如果不能满足上面两个条件,那么,令b基于10进制向左移一位,并将个位赋为p。(将个位赋予P是为了满足“b的值等于a的个位移移动到最高位所得的值”)

E5. 令a = b / 2

E6. 跳转至E2继续判断。

 

但是该算法并不通用,数字非常巨大,必须使用__int64才能支持运算,并且导致效率低下。经再次优化,得下面纯C代码算法。

#include <stdio.h>
#include <stdlib.h>
int main( void )
{
 int q = 2, a = 1;
 while ( 1 )
 {
  a = q / 2;
  printf( "%d", a );
  if ( q == 4 ) break;
  q = a + ( q % 2 ) * 10;
 }
 return 0;
}

 

mac下苹果2倍图自动生成1倍图脚本

分享个自己在用的iphone@2x图片(2倍图片retina)生成1倍大小图的脚本 首先你得装个图片切割的工具,ImageMagick #!/bin/sh rm -rf 1x rm -rf 2x ...
  • ashqal
  • ashqal
  • 2014年03月22日 21:48
  • 2412

NYOJ_264国王的魔镜

国王的魔镜 描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如...
  • u013746460
  • u013746460
  • 2014年03月25日 18:05
  • 364

NYOJ--264 国王的魔镜【水题】

国王的魔镜 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那...
  • hpuhjh
  • hpuhjh
  • 2015年02月22日 00:13
  • 1004

两倍屏和三倍屏中的1px处理方法

在做移动端页面时会面临一个问题,就是两倍屏和三倍屏问题,例如在iPhone6中就是两倍屏在iPhone6 plus中就是三倍屏,在手机页面中1px的线条会呈现2px和3px的效果,这样给用户的体验是非...
  • Renkx0404
  • Renkx0404
  • 2017年07月25日 20:24
  • 412

poj 百练 2807:两倍

总时间限制: 1000ms 内存限制: 65536kB 描述 给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。比如给定1 4 3 2 9 7 ...
  • u013417158
  • u013417158
  • 2014年01月13日 16:01
  • 1064

mysql 数字字符转换成数字整

比效简单,但也花费了我不少时间才想出来。 只要把要比较的字段加上0就可以了。 如:select * from tabal where (field+0)>100 就能够自动变成整数来比较了。...
  • lg_lin
  • lg_lin
  • 2008年11月04日 14:05
  • 1328

Python 字符串 转换 整数 浮点数 数字

使用PyOpengl的时候,调用glVertex2f时,传入两个字符串会报错,所以需要将字符串转为浮点数再传,可以使用下面的方法。 >>> import string >>> string.ato...
  • wanglei9876
  • wanglei9876
  • 2014年12月01日 20:44
  • 990

jquery 字体放大放小适合触屏版、web版

$(function () { $(".msg_caption a").click(function () { var minSize = 12...
  • lizhixin705
  • lizhixin705
  • 2016年11月01日 10:10
  • 335

摄影测量后方交会-前方交会(C#)

双像解析摄影测量中的后交-前交解法,常用于已知像片的外方位元素、需确定少量待定点坐标的情况。解算过程分为两个阶段:后方交会、前方交会。 思路为利用后方交会计算外方位元素,利用前方交会解算待定地面点坐...
  • u011670396
  • u011670396
  • 2015年09月05日 20:39
  • 3177

如何使用rand函数&随机生成80以上的数字

随机生成1-100的数字: select rand()*99+1; 在一个成绩表中如何把所有成绩都提到70分以上100以下: update courseresult set result = ra...
  • weixin_39883173
  • weixin_39883173
  • 2017年10月15日 15:50
  • 134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把2移至前方,数字立刻变成两倍
举报原因:
原因补充:

(最多只允许输入30个字)