ZOJ-1238

26 篇文章 0 订阅
5 篇文章 0 订阅

数论题。。数论太搓,没啥思路,网上搜了搜,可以先用log把输入数的位数和N map起来,因为当N大于3后,N的N次方值的位数就都不一样了,而这个值我们虽然算不出来,但是位数可以用log求出来,这样给一个字符串,我们就可以判断是N是多少,至于是不是精确等于N的N次,需要再次验证,这里我用了大数除法,数据不强,除个3次如果余数都为0,就可粗略判断出是N的N次方,可以过OJ了

#include<iostream>
#include<cmath>
#include<string>
#include<map>

using namespace std;

#define EPS 1e-6

namespace
{
	string& remove_leading_zero(string &s)
	{
		while (s[0] == '0')
			s.erase(0, 1);
		return s;
	}

	pair<string, int> divide(const string &s, int n)
	{
		if (s == "0")
			return make_pair("0", 0);
		string t = "0";
		int rem = 0;
		for (size_t i = 0; i < s.size(); i++)
		{
			rem = rem * 10 + (s[i] - '0');
			t += (rem / n + '0');
			rem = rem % n;
		}
		return make_pair(remove_leading_zero(t), rem);
	}
}

int main()
{
	map<size_t, int> M;
	for (int i = 3; i <= 100000; i++)
	{
		double d = i * log10(i);
		size_t t = (size_t) (d + 1 + EPS);
		M[t] = i;
	}
	int T;
	string s;
	cin >> T >> ws;
	while (T--)
	{
		cin >> s;
		if (s.size() == 1)
		{
			if (s == "1")
				cout << 1 << endl;
			else if (s == "4")
				cout << 2 << endl;
			else
				cout << -1 << endl;
		}
		else
		{
			int N = M[s.size()];
			pair<string, int> p = divide(s, N);
			bool can = true;
			int count = 0;
			while (p.first != "1")
			{
				if (count++ == 3)
					break;
				if (p.second != 0)
				{
					can = false;
					break;
				}
				p = divide(p.first, N);
			}
			cout << (can ? N : -1) << endl;
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值