【PAT 】1024.Palindromic Number (25) 字符操作+大数相加

来源:互联网 发布:mac怎么打出@ 编辑:程序博客网 时间:2024/06/05 14:48

题目链接: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;}//字符串转LLLL 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);}



0 0
原创粉丝点击