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

题目: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;
}

结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 20:39:39

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

【Teradata SQL】从中文数字字母混合字符串中只提取数字regexp_substr

目标:从中文数字字母的字符串中只提取数字 sel regexp_substr('mint choc中文11国1','\d+') 原文地址:https://www.cnblogs.com/badboy200800/p/10792095.html

华为OJ训练题之 比赛情况统计

题目如下: 比赛情况统计 有一个游戏平台,各个参赛队伍(以唯一的TeamID来标识)之间进行单循环的对抗赛,两个队伍之间只举行一场比赛,比赛以得分的多少定胜负.需要完成一个统计赛况的程序,能够随时查询指定队伍的最新赛况:包括胜.平.负的局数,当前总积分以及名次. 说明:循环赛没有全部结束时也可以查询某个队伍的最新赛况 规则说明 比赛判定:两个队伍中得分高的一方为胜者,另一方为负者:得分相同则为平局 积分规则:每一局比赛: 胜者积3分;平局双方各积1分; 负者积0分 排名规则:按照当前总积分的高低

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

逻辑训练题

1 , 逻辑思维训练题:凶手是谁? 有一个女明星被杀害了,警察抓住两个嫌疑犯,但不能肯定他们谁是凶手.于是警察就展开了调查,发现这个女明星生前很喜欢收藏鞋子,她的鞋箱被翻乱后被凶手放好,警察发现她有八十双鞋子,红箱子有红色和绿色的鞋子各二十双,绿色箱子有红色和绿色的鞋子各二十双,这些鞋子摆的很整齐.警察问两个嫌疑犯你们谁是红绿色盲,甲说:"乙是红绿色盲."聪明的你能猜出请是凶手吗? > > > 分析过程及答案的请往下看 > > > 参考答案: 甲是凶

剑指offer(Java版)第一题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一个重复的数字。 *例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。

/*在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3.*/ import java.util.*; public class Class1 { static class findRepeatedNumber{ public int findRepeatedN

《剑指offer》第四十四题:数字序列中某一位的数字

// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一 // 个函数求任意位对应的数字. #include <iostream> #include <algorithm> using namespace std; int countOfIntegers(int digits); int digitAtIndex(

《剑指offer》第五十六题II:数组中唯一只出现一次的数字

// 面试题56(二):数组中唯一只出现一次的数字 // 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次.请 // 找出那个吃出现一次的数字. #include <cstdio> #include <exception> int FindNumberAppearingOnce(int numbers[], int length) { if (numbers == nullptr || length <= 0) throw new std::exceptio

php在数字前面补0得到固定长度数字的两种方法

比较基础,其实两个内置函数都能实现. 1  sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 本函数用来将字符串格式化.参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止.而在转换的格式间依序包括了 填空字符.0 的话表示空格填 0:空格是默认值,表示空格就放着. 对齐方式.默认值为向右对齐,负号表向左对齐. 字段宽度.为最小宽度. 精确度.指在小数点后的浮点数位数.

BZOJ 1833 数字计数(统计[a,b]每个数字出现次数)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1833 题意:给定区间[a,b].求区间内0到9每个数字出现的次数. 思路:f[i][j]表示到后i位是否全 0(j=1表示i位之前全0)这个状态某个数字出现的次数,p[i][j]表示这个状态后面有多少个数字.那么当前枚举到的数字为要统计的数字时,答案加 上后面还有多少种数字,即下一个状态的p值.那么我们枚举要统计的数字依次统计即可. i64 f[20][2],p[20][2]; i64