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;
}
結果:



發佈了70 篇原創文章 · 獲贊 44 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章