c++训练题(数字的2~6倍只改变数字的顺序)

来源:互联网 发布:win7旗舰版优化批处理 编辑:程序博客网 时间:2024/06/10 02:35

题目:It can be seen that the number, 125874, and its double, 251748, contains exactly the same digits, but in a different order. Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contains the same digits.

大概意思是:某些数,比如125874, 2倍为251748, 只改变了数字的顺序,没有改变数字的个数和具体的某个数字。找出最小的一个整数,这个整数的2倍、3倍、4倍、5倍、6倍,都满足这个条件。

分析:1.从小到大依次增加,先计算6倍,6倍如果位数增加,则不用计算其他的倍数,且数字也增加一位,比如2的6倍为12,就不用计算2、3、4、5倍了,也不用计算3、4、5、6、7、8、9,直接跳到10.

2.把数字转换成字符串,用STL标准库自带的函数来处理。sort函数是自带的排序函数。

代码:

// test.cpp : 定义控制台应用程序的入口点。///*题目:125874*2=251748,两数有同样的数字,只是数字的顺序不同,找出满足规律的最小整数x,x的2倍,3倍,4倍,5倍和6倍都满足上述条件,数字相同,顺序不同。分析:1.数据从小到大依次进行2.先判断6倍时是否越界,如果越界直接跳到下一个位数(如2位数跳到3位数的第一个比如100开始运算)3.判断5倍、4倍、3倍、2倍是否数字相同,都转移到字符串上进行运算*/#include "stdafx.h"#include <iostream>#include <algorithm>#include <string>#include <sstream>#include <cmath>using namespace std;//计算数字的位数int digit(double num){return log10(num)+1; }//看两个数是否相同,通过转移到字符串上进行计算bool match(string str1, string str2){sort(str1.begin(),str1.end());sort(str2.begin(),str2.end());return str1==str2;}//跳的过程,比如从2直接跳到10long long init(int digit){return long long(pow(10.0,digit-1));}int _tmain(int argc, _TCHAR* argv[]){long long num=1;bool flag=true;stringstream ss;string data;string str;int i=0;while(true){int dig=digit(num);//输入数字的个数//ss<<num;str=ss.str();//连续使用记得清除并记零ss.clear();ss.str("");long long enter;////下一个位数的数字enter=digit(num*6);if(enter==dig){ss<<6*num;data=ss.str();ss.clear();ss.str("");flag=match(str,data);if(flag==true){for(i=5; i>1; i--){enter=digit(i*num);ss<<i*num;data=ss.str();ss.clear();ss.str("");flag=match(str,data);if(flag==false){break; }}if(flag==true)break;}}else{//如果*6位数加1了,就得把num位数多一位的第一个数num=init(enter);continue;}++num;}cout<<"符合要求的最小数为"<<num<<endl;cout<<"2倍"<<2*num<<endl;cout<<"3倍"<<3*num<<endl;cout<<"4倍"<<4*num<<endl;cout<<"5倍"<<5*num<<endl;cout<<"6倍"<<6*num<<endl;system("pause");return 0;}
结果:



0 0
原创粉丝点击