题目链接:http://www.patest.cn/contests/pat-a-practise/1024
第一次,只过了部分数据,数据长度超过long long
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
#include<string.h>
#include<stdio.h>
#include<math.h>
typedef long long LL;
//递归判断回文串
bool Palindromic(int low, int high, char *str, int len)
{
if (len == 0 || len == 1)
return true;
if (str[low] != str[high])
return false;
return Palindromic(low + 1, high - 1, str, len - 2);
}
//LL型转字符串
char *LLtoa(LL num)
{
char str[30];
int i = 0, j = 0;
char temp[20];
do
{
temp[i] = num % 10 + '0';
num /= 10;
i++;
} while (num>0);
temp[i] = '\0';
i--;
while (i >= 0)//反向操作
{
str[j] = temp[i];
j++;
i--;
}
str[j] = '\0';
return str;
}
//字符串转LL
LL atoLL(char *str)
{
LL value = 0;
while (*str >= '0' && *str <= '9')
{
value *= 10;
value += *str - '0';
str++;
}
return value;
}
//LL反转
LL revNum(LL num)
{
int i = 0, j = 0;
char temp[30]="";
do
{
temp[i] = num % 10 + '0';
num /= 10;
i++;
} while (num>0);
temp[i] = '\0';
return atoLL(temp);
}
int main1024_1()
{
LL N,T;
int K, len;
char str[30];
bool flag = false;
scanf("%lld %d",&N,&K);
T = N;
for (int i = 0; i < K; i++)
{
memset(str, 0, sizeof(str));
strcpy(str, LLtoa(T));
len = strlen(str);
if (Palindromic(0,len-1,str,len))
{
printf("%lld\n%d\n", T,i);
flag = true;
break;
}
else
{
T = T + revNum(T);
}
}
if (!flag)
{
printf("%lld\n%d\n", T, K);
}
scanf("%d", &K);
return 0;
}
第二次,字符操作,大数相加,位数相同直接首尾相加
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define maxN 200
//递归判断回文串
bool Palindromic(int low, int high, char *str, int len)
{
if (len == 0 || len == 1)
return true;
if (str[low] != str[high])
return false;
return Palindromic(low + 1, high - 1, str, len - 2);
}
bool solve(char *sl)
{
int len=strlen(sl);
int i,j,t,p=0;
char res[maxN] = { 0 };
if (Palindromic(0,len-1,sl,len))
return true;
else
{
for (i = len - 1, j = maxN - 1; i >= 0; i--)//首尾相加
{
t = (sl[i] - '0') + (sl[len - i - 1] - '0') + p;
p = t / 10;
res[--j] = t % 10 + '0';
}
if (p != 0)
{
res[--j] = p + '0';
}
strcpy(sl, res + j);
return false;
}
}
int main()
{
int i,k;
char str[maxN];
scanf("%s %d", str, &k);
for (i = 0; i < k; i++)
{
if (solve(str))
break;
}
printf("%s\n%d\n",str,i);
//scanf("%d", &k);
}