PAT甲级——1015 Reversible Primes (20分)

这题真是恶心,题目开始没看懂,绕来绕去,很像PAT乙级的题,没啥算法和数据结构,就是绕来绕去看你英语水平咋样,醉了

我的没AC……

还是看别人的AC代码:https://www.cnblogs.com/findview/p/11694354.html

#include<iostream>
#include<cmath>
using namespace std;

int a[20];        //存放n转换成的d进制数的每一位 
int cnt;        //存放d进制的位数
 
bool isPrime(int x){
    if(x == 1) return false;
    for(int i = 2; i <= sqrt(x); i++){
        if(x % i == 0) return false;
    } 
    return true;
}

void transform(int n, int d){
    //短除法 将值存入a数组
    cnt = 1;
    while(n > 0){        
        int x = n % d;
        a[cnt++] = x; 
        n /= d;
    }
    //将a数组从cnt-1~1开始遍历完成将d进制的翻转再次转换成10进制表示的过程
    int ans = 0;
    int base = 1;
    for(int i = cnt-1; i >= 1; i--){
        ans += base * a[i];
        base *= d;
    } 
    if(isPrime(ans)) printf("Yes\n");
    else printf("No\n");
} 

int main(){
    int n, d;
    while(scanf("%d", &n) != EOF){
        if(n < 0) break;
        scanf("%d", &d);
        if(isPrime(n)){
            //将n转换成d进制的数
            transform(n, d); 
        }else{
            printf("No\n");
        }
    }
    return 0;
}

我的。。。

//1015
/*
73 10
23 2
23 10
-2
*/
#include <iostream>
#include <cmath>
using namespace std;

bool isPrime(int d){//判断是否是素数
    if(d==2)
        return true;
    if(d<2||d%2==0)
        return false;
    int i=3;
    while(i<=sqrt(d)){
        if(d%i==0)
            return false;
        i+=2;
    }
    return true;
}

int change(int n,int d){
	int i,j,b[100],cnt=0;
	while(n){
		b[cnt]=n%d;
		cnt++;
		n=n/d;
	}
	int ans=0;
	for(i=cnt-1;i>=0;i--){
		int tmp=1;
		for(j=0;j<cnt-1-i;j++){
			tmp=tmp*d;
		}
		ans=ans+b[i]*tmp;
	}
	return ans;		
}

int main(){

    int a,b;
    while(true){
        cin>>a;
        int d=0,i=0,c=0;
        if(a<=0)
            break;
        cin>>b;
        while(a>0){
            c = a%10;
            if(i!=0){
                for(int j=0;j<i;j++){
                    c*=b;
                }
            }
            i++;
            d+=c;
            a/=10;
        }
        int f = change(a,b);
        cout<<d<<endl;
        // int r=d;
        // int e[100]={0};
        // int k=1;
        // while(d>0){
        //     e[k]=d%10;
        //     d/=10;
        //     k++;
        // }
        // //将数字倒序
        // int f=e[k-1];
        // for(int n=k-2;n>=1;n--){
        //     int g=e[n];
        //     int y=k-n-1;
        //     while(y!=0){
        //         g*=10;
        //         y--;
        //     }
        //     f+=g;
        // }
        cout<<f<<endl;
        if(isPrime(d)&&isPrime(f))
            cout<<"Yes"<<endl;
        else{
            cout<<"No"<<endl;
        }
    }

    return 0;
}

写的真丑陋。。。

发布了298 篇原创文章 · 获赞 301 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104378069