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

原创 2015年07月09日 10:39:45

题目: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直接跳到10
long 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;
}
结果:



2016腾讯实习生笔试编程题:有趣的数字

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: 输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数 a1,a2...a...
  • u011086367
  • u011086367
  • 2016年10月21日 10:49
  • 742

【C++心路历程21】NOIP2003普及组复赛第4题数字游戏

【问题描述】   游戏是这样的:在你面前有一圈整数(一共N个),你要按顺序将其分为M个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或...
  • ctf109
  • ctf109
  • 2017年01月20日 19:49
  • 325

C++输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,

//输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, //例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //则依次打印出数字1...
  • liuhuiyan_2014
  • liuhuiyan_2014
  • 2015年05月06日 11:25
  • 1328

蓝桥杯 ALGO-124 算法训练 数字三角形 的两种算法

蓝桥杯练习系统算法训练数字三角形的两种算法
  • wzh190015
  • wzh190015
  • 2015年11月30日 22:25
  • 2060

英文中数字的训练

数字在信息传递中极为重要, 无论是日常对话还是新闻播报都会涉及到数字, 而数字都极其细微, 稍有差错就会导致理解相差甚远。在英语听力中, 与数字相关的读写练习自然也是学习重点之一, 这也是英语听力中的...
  • u010196648
  • u010196648
  • 2014年01月03日 00:21
  • 1018

[编程题] 有趣的数字

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: 输入包含多组测试数据。 对于每组测试数据: N - 本组测试...
  • You_are_my_dream
  • You_are_my_dream
  • 2017年01月22日 18:27
  • 452

[网络流24题 #16]数字梯形问题

这是一道很经典的费用流题目,可以通过最大费用最大流实现 通过分析题目,我们很容易想到建模方法: 1、对于规则一,题目规定每一个节点只能访问一次,也就是说,实际上这个时候每一个点都有容量限制,所以我们...
  • u013366983
  • u013366983
  • 2014年01月28日 10:36
  • 725

Windows下利用caffe训练印刷体数字并识别测试

写这篇文章主要是为了记录在windows下利用caffe训练、识别印刷体数字的过程,加深自己的印象的同时也给有这需求的人作为参考,针对下文中涉及到的一些参数修改如有不明之处建议上网查询,网上有很多相关...
  • daiaiji
  • daiaiji
  • 2017年07月06日 11:31
  • 595

C++学习笔记--顺序容器

容器是一种模版类型,可以容纳某种指定的类型。顺序容器是指,容器中的元素是按元素加入容器的顺序存储的。 常用的顺序容器有vector、(string)、list、deque,以及C++11新增的for...
  • du_qi
  • du_qi
  • 2016年08月15日 10:40
  • 422

字符串的前后顺序移动

/* 4、编写字符串处理函数,将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序, 函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,...
  • cao478208248
  • cao478208248
  • 2014年08月25日 17:25
  • 665
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++训练题(数字的2~6倍只改变数字的顺序)
举报原因:
原因补充:

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