题意:
输入STEP和MOD,使用seed(x+1) = [seed(x) + STEP] % MOD函数计算出一个长度为MOD伪随机数数列,如果这个随机数列中没有相同的数字,则输出Good Choice,否则输出:Bad Choice(格式有示例,此外简略说一下)。
设SETP=3,MOD=5,则有:
0:0;
该序列为:0 3 1 4 2 ,并没有重覆的数字所以是个正确的选择(Good Choice)。
示例输入:
3 5
示例输出:
3 5 Good Choice
解决方案1:
当然这是最笨的方法,后面有第二种方法,才是正解
1、先计算出这个伪随机数列;
2、将这个数列排序(从小到大排序后,arr[i]==arr[i+1]的话,说明有相等的数字存在,结束输出);
3、注意输出时的格式,整数的占位为10,后字符串前有5个空格,字符串后有一个空行。
#include<iostream> #include<algorithm> #include<iomanip> 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; i++) arr[i]=(arr[i-1]+step)%mod; sort(arr,arr+mod,cmp); for(i=0; i<mod-1; i++) if(arr[i]==arr[i+1]) break; if(i>=mod-1) cout<<setw(10)<<step<<setw(10)<<mod<<" Good Choice"<<endl<<endl; else cout<<setw(10)<<step<<setw(10)<<mod<<" Bad Choice"<<endl<<endl; } }
解决方案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<y) return GCD(y,x); if(y==0) return x; else { if(x&1==0) { if(y&1==0) return (GCD(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); } } }