这题真是恶心,题目开始没看懂,绕来绕去,很像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;
}
写的真丑陋。。。