回文数,蛮有趣的一道题,思路是这样的,观察得到回文数即是从倒数第二位开始一次拼接在原有数的倒数第一个位置之后。所以就想到了得先求出数的位数,接着把这个数扩大相应的10的位数减1倍,这样说可能有点难以理解,但我举个例子,比如说1234,是个四位数,第一步先把他扩大1000倍(就是10的位数(4)减1次倍),然后再通过取余之后相加,得到回文数,再进行素数的判断。
写完之后看了眼别人的答案,发现有个优化的放法,即是取余和扩大可以同时进行,每取一次余就把原有的数扩大10倍,这样也行。会比我的好,但我当时没想到(果然还是菜鸟)
为什么要long int?因为int的话有两个用例不过,检查代码逻辑时发现有可能是超出范围了。所以改成long int,就全部通过了。
#include <stdio.h> int main(){ long int a; scanf("%ld",&a); int count = 0; long int b = a; long int c = a; while(b != 0){ //求位数 count++; b /= 10; } a = a*(int)pow(10,count-1); //扩大 while(count-1 != 0){ //得到回文数 c /= 10; a += c%10*(int)pow(10,count-2); count--; } int flag; for(int i = 2;i<=(int)sqrt(a);i++){ //判断是否为素数 flag = 1; if(a%i == 0){ flag = 0; break; } } if(flag){ printf("prime"); } else{ printf("noprime"); } return 0; }