HDOJ1014 Uniform Generator 【三种解法(暴力+互质)】

HDOJ1014

题目在这里插入图片描述
思路
简单来说,题目的意思是给定STEP和MOD,能够把0到MOD-1的数都产生一次的就是Good Choice,否则就是Bad Choice。
1.暴力求解:定义一个seed数组从seed[0]依次往后计算。定义一个布尔型isChange数组,计算出seed[i]的值时,对应的isChange[seed[i]]就记为true。最后如果isChange数组中的值都为true,说明从0到MOD-1的数都产生了,结果为Good Chioce。
2.互质:如果STEP和MOD互质,结果为Good Choice。
3.基于方法一的优化:不用isChange数组,用一个计数器记录产生的seed数组元素的数量。一旦seed等于零,说明产生的数出现了循环,break。这样的话相比方法一节省了很多内存。

代码
暴力求解

#include<cstdio>
#include<iostream>
#include<string.h>
#include <iomanip>
#include <cstring>
using namespace std;
int main()
{
    int STEP, MOD, i, flag;
    bool isChange[100000];
    int seed[100000];
    while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000)
    {
        memset(isChange, false, sizeof(isChange));
        flag = 1;
        seed[0] = 0;
        isChange[seed[0]] = true;
        for(i=0;i<MOD-1;i++)
        {
            seed[i+1]= (seed[i] + STEP)%MOD;
            isChange[seed[i+1]] = true;
        }
        for(i=0;i<MOD;i++)
        {
            if(isChange[i]==false)
            {
                flag = 0;
                break;
            }
        }
        cout << setiosflags(ios::right) << setw(10) << STEP << setw(10) << MOD << "    "; 
        cout << setiosflags(ios::left); 
        if(flag==1)
        {
        
            printf("Good Choice\n\n");    
        }
        else
        {    
            printf("Bad Choice\n\n");    
        }
    } 
} 

互质

#include<stdio.h>
int zg(int step, int mod)
{
    if(mod==0)
    {
        return step;
    }
    else
    {
        zg(mod, step%mod);
    }
}
int main()
{
        int STEP, MOD, i;
        while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000)
        {
            if(zg(STEP, MOD)==1)
            {
                printf("%10d%10d    Good Choice\n\n",STEP,MOD);
            }
            else
            {
                printf("%10d%10d    Bad Choice\n\n",STEP,MOD);
            }
        }
}

暴力求解优化(内存优化)

#include<stdio.h>
int main()
{
    int STEP, MOD, i;
    int count;
    int seed;
    while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000)
    {
        count = 1;
        seed = 0;
        for(i=0;i<MOD;i++)
        {
            seed= (seed + STEP)%MOD;
            if(seed!=0)
            {
                count++;
            }
            else
            {
                break;
            }
        }
        if(count==MOD)
        {
            printf("%10d%10d    Good Choice\n\n",STEP,MOD);
        }
        else
        {    
            printf("%10d%10d    Bad Choice\n\n",STEP,MOD);
        }
    }
    
} 

Conclusion
条条大路通罗马,可以多尝试一些方法。另外,输出格式仍然是一个不可忽视的问题,仔细审题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值