杭电OJ(HDOJ)1014题:Uniform Generator(数论,最大公约数)

题意:

输入STEP和MOD,使用seed(x+1) = [seed(x) + STEP] % MOD函数计算出一个长度为MOD伪随机数数列,如果这个随机数列中没有相同的数字,则输出Good Choice,否则输出:Bad Choice(格式有示例,此外简略说一下)。

设SETP=3,MOD=5,则有:

0:0;
1:(0+3)%5=3;
2:(3+3)%5=1;
3:(1+3)%5=4;
4:(4+3)%5=2;

该序列为:0 3 1 4 2 ,并没有重覆的数字所以是个正确的选择(Good Choice)。

示例输入:

3 5
15 20
63923 99999


示例输出:

3 5 Good Choice
15 20 Bad Choice
63923 99999 Good Choice


解决方案1:

当然这是最笨的方法,后面有第二种方法,才是正解

1、先计算出这个伪随机数列;

2、将这个数列排序(从小到大排序后,arr[i]==arr[i+1]的话,说明有相等的数字存在,结束输出);

3、注意输出时的格式,整数的占位为10,后字符串前有5个空格,字符串后有一个空行。

#include
#include
#include
int cmp(int a,int b)
{
    if(a<=b)
        return 1;
    return 0;
}
using namespace std;
int main()
{
    int step,mod,i,arr[100000],t;
    while(cin>>step>>mod)
    {
        arr[0]=0;
        for(i=1; i=mod-1)
            cout<

解决方案2:

其实问题就是判断两数是否互为质数,就是两个数的最大公约数是1。

#include"stdio.h"
int GCD(int m,int n)
{
    int t;
    while(n)
    {
        t=m%n;
        m=n;
        n=t;
    }
    return m;
}

int main()
{
    int step,mod;
    while(scanf("%d%d",&step,&mod)!=EOF)
    {
        if(GCD(step,mod)==1)
            printf("%10d%10d    Good Choice\n\n",step,mod);
        else
            printf("%10d%10d    Bad Choice\n\n",step,mod);
    }
}

但上面的GCD()函数用到了取余(模除)运算,这其实降低了程序的执行效率,可以做些更改:

int GCD(int x,int y)
{
    if(x>1,y>>1)<<1);
            else
                return GCD(x>>1,y);
        }
        else
        {
            if(y&1==0)
                return GCD(x,y>>1);
            else
                return GCD(y,x-y);
        }
    }
}



你可能感兴趣的:(ACM,ACM)