2021-03-26 PAT A1015 A1078 A1096 B1017

算法笔记这一步实在是太巧妙了,把一个数字给转成对应的进制然后再逆序转成对应的十进制

#include
#include
#include
using namespace std;
const long long maxn = 100010;
bool visit[maxn];long long prime[maxn];
void find_prime(){
    visit[0] = visit[1] = 1;
    for(int i = 2;i <= maxn;i++){
        if(!visit[i]) prime[++prime[0]] = i;
        for(int j =1;j <= prime[0] && i * prime[j] <= maxn;j++){//我感觉i很大的时候,这里还是会溢出,所以需要改进
            visit[i * prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
}

int main(){
    find_prime();
    int n,radix,other;
    while(1){
        scanf("%d",&n);
        if(n < 0) break;
        scanf("%d",&radix);
        int temp[111],len = 0,n_temp = n;
        do{temp[len++] = n_temp % radix,n_temp/= radix;}while(n_temp!=0);
        for(int i = 0;i < len;i++) n_temp = n_temp *radix + temp[i];
        if(!visit[n] && !visit[n_temp]) printf("Yes\n");
        else printf("No\n");
    }
}

A1078
又用了多余的方法,明明可以边输入边输出的。。。。

#include
#include
using namespace std;
const int maxn = (1<<30) - 1;
int prime[10010];bool visit[10010];
bool pos[10010];int correspond[10010],cnt;//后面的用来记录位置
void find_prime(){
    visit[0] = visit[1] = 1;
    for(int i = 2;i <= 10010;i++){
        if(!visit[i])prime[++prime[0]] = i;
        for(int j = 1;j <= prime[0] && i*prime[j] < 10010;j++){
            visit[i*prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
}
int main(){//要不要初始出平方表?等会初始化平方表试试能不能加速
    find_prime();
    memset(correspond,-1,sizeof correspond);
    int m,n;scanf("%d %d",&m,&n);
    while(visit[m]) m++;//如果m不是素数,那么就找到离它最近的素数
    for(int i =0;i < n;i++){
        int temp; scanf("%d",&temp);
        temp %= m;
        for(int j = 0;j < m;j++){
            int cal = (temp + j * j) % m;
            if(!pos[cal]){
                pos[cal] = true;
                correspond[cnt++] = cal;
                break;
            }
        }
    }
    if(correspond[0] == -1) printf("-");
    else printf("%d",correspond[0]);
    for(int i =1;i < n;i++){
        if(correspond[i] == -1)
            printf(" -");
        else
            printf(" %d",correspond[i]);
        }
}

虽然说测试点很坑吧,但是想了想,还是自己的原因,很多的细节还是没有处理好,
一开始是测试点3没有过,然后查了一下,测试点3是60,这才想起来,2 * 3 会影响3 * 4
因为4中有因数2,在之前2被消耗掉了,后面的4可能就不能出现了
在看这道题的时候,算法笔记说要使用long long,测试了一下,并不需要,
噢噢噢,可能是我的算法跟算法笔记的不同,我的算法是边加边除,但是算法笔记的是连乘来试探

#include
#include
using namespace std;
int main(){
    long long n;scanf("%lld",&n);//我觉得这个n一直都是int范围内的,它的因子相乘,都是在根号范围内的,不会超范围啊
    long long sqr = (long long)sqrt(n),ansI,anslen = 0;//为什么要用1.0乘它?
    for(long long i = 2;i <= sqr;i++)
        if(n % i == 0){//这个成立,那么i就是它的因子
            long long j = i,temp = n;
            do{
                temp /= j;
                j++;
            }while(temp % j == 0);
            long long len = j - i;
            if(len > anslen){
                ansI = i;
                anslen = len;
            }
        }
    
    if(anslen > 0){
        printf("%lld\n",anslen);
        printf("%lld",ansI);
        for(long long i = ansI + 1;i < ansI + anslen;i++)printf("*%lld",i);
    }
    else printf("1\n%lld",n);
}

我服了,两次提交,一次超时,一次过了,过不过还看运气的嘛

#include
#include
using namespace std;
struct bign{
    int d[1010], len;
    bign(){memset(d,0,sizeof d);len = 0;}
    void change(char* str){
        len = strlen(str);int j = 0;
        for(int i = len - 1;i >= 0;i--)
            d[j++] = str[i] - '0';
    }
    void divide(int& g){
        //for(int i =0;i < len;i++)printf("%d",d[i]);
        int r = 0;
        for(int i = len - 1;i >= 0;i--){
            r = r * 10 + d[i];
            if(r < g) d[i] = 0;
            else {
                d[i] = r / g;
                r = r % g;
            }
        }
        while(len > 1 && d[len - 1] == 0) len --;
        g = r;
    }
};
int main(){
    char str[1010];scanf("%s",str);
    int d;scanf("%d",&d);
    bign num;num.change(str);
    num.divide(d);
    for(int i = num.len - 1;i >= 0;i--) printf("%d",num.d[i]);
    printf(" %d",d);
        
}

你可能感兴趣的:(2021-03-26 PAT A1015 A1078 A1096 B1017)