若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
标签:lag 不为 bsp strlen class 逆序数 ssi sum sam
10
87
4
十六进制的10-15用A-F表示
我的解法(吐槽一下,在杭州师范OJ已AC,在登登OJ通过不了emm)
//30步内求N进制数回文数 #include<stdio.h> #include<string.h> char str[500]; char re_str[500]; int flag=0; void renum(){ memset(re_str,‘\0‘,sizeof(re_str)); int len=strlen(str); for(int i=0;i<len;i++){ re_str[i]=str[len-1-i]; } if(strcmp(str,re_str)==0) flag=1; } void sum(int k){ int len=strlen(str); char temp[120]={‘0‘}; int cf=0; for(int i=0;i<len;i++){ // if(k<10){ if(str[len-1-i]-‘0‘+re_str[len-1-i]-‘0‘+cf>=k){//预判,需要进位 temp[len-i]=(str[len-1-i]-‘0‘+re_str[len-1-i]-‘0‘+cf)%k+‘0‘; cf=1; } else{ temp[len-i]=(str[len-1-i]-‘0‘+re_str[len-1-i]-‘0‘+cf)+‘0‘; cf=0; } } else{ //为了方便10进制以上的计算,先全部转化为整数 int instr,inre_str,intemp; if(str[len-1-i]>=‘A‘) instr=str[len-1-i]-‘A‘+10; else instr=str[len-1-i]-‘0‘; if(re_str[len-1-i]>=‘A‘) inre_str=re_str[len-1-i]-‘A‘+10; else inre_str=re_str[len-1-i]-‘0‘; // if(instr+inre_str+cf>=k){//有进位 intemp=(instr+inre_str+cf)%k; cf=1; } else{ intemp=instr+inre_str+cf; cf=0; } if(intemp>=10) temp[len-i]=intemp-10+‘A‘; else temp[len-i]=intemp+‘0‘; } } if(cf==1){ temp[0]=‘1‘; strcpy(str,temp); } else{ for(int j=0;j<len;j++){ str[j]=temp[j+1]; } } } int main(){ int n; scanf("%d",&n); if(((n>=2&&n<=10)||n==16)){ scanf("%s",str); int cou=30; flag=0; while(cou>0){ renum();//求得当前str的逆序数re_str if(flag==1) break; sum(n);//将str和re_str求和,结果放在str中 cou--; } if(flag==1)printf("STEP=%d\n",30-cou); else printf("Impossible!\n"); } return 0; }
标签:lag 不为 bsp strlen class 逆序数 ssi sum sam
原文地址:https://www.cnblogs.com/debug-the-heart/p/12486917.html