1. 直接用了上道题的函数,另外,进制转换:
string trans(int a)
{
string str1 = "";
int tmp;
while (a)
{
tmp = a % base;
if (tmp < 10)
str1 += tmp + '0';
else
str1 += tmp - 10 + 'A';
a /= base;
}
return str1;
}
2. 我的代码:
/*
ID: dollar4
PROG: dualpal
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int n, s;
bool checkp(string str)
{
int len = str.size();
for (int i = 0; i < len; i++)
{
if (str[i] != str[len-1-i])
return false;
}
return true;
}
string trans(int a, int b)
{
string str1 = "";
int tmp;
while (a)
{
tmp = a % b;
str1 += tmp + '0';
a /= b;
}
return str1;
}
int main()
{
ofstream fout ("dualpal.out");
ifstream fin ("dualpal.in");
int cnt = 0, i, tmp, j;
string str;
fin >> n >> s;
for (i = s + 1; cnt != n; i++)
{
tmp = 0;
for (j = 2; j < 11; j++)
{
str = trans(i, j);
if (checkp(str))
tmp++;
if (tmp >= 2)
{
fout << i << endl;
cnt++;
break;
}
}
}
return 0;
}
3. 官方参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
/* is string s a palindrome? */
int
ispal(char *s)
{
char *t;
t = s+strlen(s)-1;
for(t=s+strlen(s)-1; s<t; s++, t--)
if(*s != *t)
return 0;
return 1;
}
/* put the base b representation of n into s: 0 is represented by "" */
char*
numbconv(char *s, int n, int b)
{
int len;
if(n == 0) {
strcpy(s, "");
return s;
}
/* figure out first n-1 digits */
numbconv(s, n/b, b);
/* add last digit */
len = strlen(s);
s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];
s[len+1] = '\0';
return s;
}
/* is number n a dual palindrome? */
int
isdualpal(int n)
{
int i, j, npal;
char s[40];
npal = 0;
for(i=2; i<=10; i++)
if(ispal(numbconv(s, n, i)))
npal++;
return npal >= 2;
}
void
main(void)
{
FILE *fin, *fout;
int n, s;
fin = fopen("dualpal.in", "r");
fout = fopen("dualpal.out", "w");
assert(fin != NULL && fout != NULL);
fscanf(fin, "%d %d", &n, &s);
for(s++; n>0; s++) {
if(isdualpal(s)) {
fprintf(fout, "%d\n", s);
n--;
}
}
exit(0);
}