Online Judge 0004:双基回文数

Time Limit:
10000ms
Memory Limit:
65536kB
Description

如果一个正整数n至少在两个不同的进位制b1b2下都是回文数(2<=b1,b2<=10< span="">),则称n是双基回文数(注意,回文数不能包含前导零)。输入十进制的正整数S<106,输出比S大的最小双基回文数(十进制)

Input
一个十进制整数
Output
一个十进制整数
Sample Input
1600000
Sample Output
1632995

http://nnsznoi.openjudge.cn/directlycalculatin/0004/


第一想法尝试用itoa,但是g++不支持。

因此需要自己实现itoa,参考 http://stackoverflow.com/questions/228005/alternative-to-itoa-for-converting-integer-to-string-c

string itoa(int a)
{
    string ss="";   //create empty string
    while(a)
    {
        int x=a%10;
        a/=10;
        char i='0';
        i=i+x;
        ss=i+ss;      //append new character at the front of the string!
    }
    return ss;
}

但发现运行的很慢,因此需要避免char相加,改进如下:

string myitoa(int a, int base)
{
	string ss;
	ss.clear();
	while(a)
	{
		ss += (a%base);
		a /= base;
	}
	return ss;
}



AC code:

#define RUN
#ifdef RUN

/**
http://nnsznoi.openjudge.cn/directlycalculatin/0004/
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <list>
#include <cctype> 
#include <algorithm>
#include <utility>
#include <math.h>

using namespace std;

#define LL long long
#define MAXN 1000001


char tmp[MAXN];

string myitoa(int a, int base)
{
	string ss;
	ss.clear();
	while(a)
	{
		ss += (a%base);
		a /= base;
	}
	return ss;
}

bool isPalindrome(string s){
	int len = s.length();
	for(int i=0; i<len/2; i++){
		if(s[i] != s[len-1-i]){
			return false;
		}
	}
	return true;
}

void check(LL n){
	LL test = n+1;

	for(;;){
		int cnt = 0;
		for(int i=2; i<=10; i++){
			//itoa(test, tmp, i);
			string s = myitoa(test, i);
			
			if(isPalindrome(s)){
				//cout << test << "--" << s << "---" << cnt << endl;
				cnt++;
				if(cnt >= 2){
					cout << test << endl;
					return;
				}
			}
		}
		++test;
	}
}



int main(){

#ifndef ONLINE_JUDGE
	freopen("oj0004.in", "r", stdin);
	freopen("oj0004.out", "w", stdout); 
#endif

	LL n;

	while(scanf("%lld",&n) != EOF){
		check(n);
	}

}


#endif



posted @ 2013-03-09 20:07  WingWing111  阅读(269)  评论(0编辑  收藏  举报