把2移至前方,数字立刻变成两倍
2004-07-01 12:26
423 查看
论坛上有人出了这样一道,求一个数,这个数的个位数是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;
}
一开始我用循环穷举,无果,估计此数可能非常巨大。分析算法后发现可以简化为:
#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;
}
相关文章推荐
- 数字变成大写的类,把人民币转化为大写汉字
- java使用poi处理excel防止数字变成科学计数法的形式
- JAVA字符串的一些特殊应用——数字变成字符串并位数补足0等
- 笔记本键盘字母变成数字的解决方法
- 关于导入到Excel中的数字变成字符格式
- IOS手机 html5页面 数字变成蓝色链接的原因
- poi和jxl 处理大数字时点击后变成科学计数法
- 数组操作-将下标变成从0开始的连续数字
- mysql插入数字都变成2147483647的解决方法
- 用java.lang.Character把一个String数字小写字母变成大写
- java excel 上传 长数字变成科学计数法处理
- 解决excel日期变成数字的问题
- excel输入数字变成特殊符号问题
- EXCEL表格 显示 超长 数字 E+ 变成 文本格式,数字全部显示
- 数字变成大写的类,把人民币转化为大写汉字
- CSV文件中长数字自动变成科学计数法怎么处理?
- 笔记本键盘输入错乱,字母都变成数字了
- java使用poi处理excel防止数字变成科学计数法的形式
- 将传统书房变成数字书房 数字书房DIY
- Unity 把数字,英文图片变成字体