pat A1015
题意:
输入:
1.输入n,d
2.如果单独输出一个负数则结束循环
输出:
1.判断n是否为素数,将n在d进制下反转后在化为10进制数后任为素数,就输出yes,否则输出no
解题思路:
参考代码:
#include<iostream>
#include<cmath>
using namespace std;
/*
解题思路:
1.先判断n是否为素数
2.如果n为素数,在用do-while语句求出n的指定基数radix的数放到数组中,然后逆着从数组中在求出对应10进制的数
3.判断此时的n是否为素数,如果为素数就输出yes;否则输出no
4.在1中判断如果不是素数则直接输出no,结束循环
*/
bool isPrime(int n)
{
if(n<=1)
return false;
for(int i=2; i*i<n; i++)
if(n%i==0)
return false;
return true;
}
int d[111111];
int main()
{
int n,radix;
while(scanf("%d",&n)!=EOF) //针对于判题机设置的,如果到达文件尾则结束循环
{
if(n<0)
break;
cin >> radix;
if(isPrime(n)==true)
{
int kk=0,jj=1;
do
{
d[kk++]=n%radix;
n/=radix;
}while(n!=0);
for(int i=kk-1; i>=0; i--)
{
n+=jj*d[i];
jj*=radix;
}
if(isPrime(n)==true)
cout << "Yes" << endl;
else
cout << "No" << endl; //不要忘记这里,对于样例中第3中情况,23为素数,但是32不是素数,如果不加,此处的else,则就不会输出no
}
else
cout << "No" << endl;
}
return 0;
}
技术总结:
1.在没有指定次数的循环中,用如下代码,可以使用于判题机
while(scanf("%d",&n)!=EOF)
2.求一个数在指定进制radix下逆转后的10进制数
int kk=0,jj=1; //kk表示下标,radix表示指定进制,n表示所要转化的数
do
{
d[kk++]=n%radix;
n/=radix;
}while(n!=0);
for(int i=kk-1; i>=0; i--) //在数组中从后向前,统计它逆转后的10进制数
{
n+=jj*d[i]; //jj从1开始
jj*=radix; //jj后面每次乘上radix
}
–
pat A1078
题意:
输入:
1.输入数组长度,元素个数
输出:
1.在公式中Tsize表示比数组长度大的最小素数
2.根据题中公式计算出每一个元素的合适位置,如果之前这个位置有别的数字,则用平方探测法,如果最后还是找不到这个位置则输出-
解题思路:
参考代码:
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
const int N=11111;
/*
1.前面就是设置素数判断函数isPrime(),找出最小比数组长度大的素数
2.如下图见整个代码思路:
*/
bool isPrime(int n)
{
if(n<=1)
return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2; i<=sqr; i++)
if(n%i==0)
return false;
return true;
}
bool hashTable[N]={0}; //hashTable[x]==false则x号未被使用过
int main()
{
int n,TSize,a;
cin >> TSize >> n;
while(isPrime(TSize)==false)
{ //找出第一个大于TSize的素数
TSize++;
}
for(int i=0; i<n; i++)
{
cin >> a; //输入对应的数字
int M=a%TSize; //计算它求余后的数字
if(hashTable[M]==false) //如果hashTable[M]==false表示M位置没有被使用,就找到了
{
hashTable[M]=true;
if(i!=0)
cout << " ";
cout << M;
}
else //(表示之前已经用过这个位置上的数字,此时就是想输出-)不是括号中所理解的意思,而是如果这个数在算出他的位置后,如果前面已经用过需要把它放到合适的位置(用二次方探测法),如果整个表没有能放这个数的位置,才会输出-
{
int step; //二次方探查步长
for(step=1; step<TSize; step++)
{
M=(a+step*step)%TSize;
if(hashTable[M]==false)
{
hashTable[M]=true;
if(i!=0)
cout << " ";
cout << M;
break; //如果一但用平方探测法找到合适的位置就应该退出,然后进入到下一个值的位置计算,不然的话他妈的一直在找这个数字所有的位置,一直到循环结束
}
}
if(step>=TSize)
{
//找不到插入的地方
if(i>0)
cout << " ";
cout << "-";
}
}
}
return 0;
}