z * L + I mod M
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cstdio>
#include<iostream>
#include<math.h>
#include <map>
using namespacestd;
int main(){
int z,i,m,l;
int c =1;
while (scanf("%d%d%d%d",&z,&i,&m,&l)) {
if((z ==0)&&(i == 0)&&(m ==0)&&(l == 0))break;
int sum =0;
int num[10000]={0};
sum = l;
int count =1;
while(1){
if(num[sum] !=0) {
count -= num[sum];
break;
}
num[sum] = count;
sum = ((z * sum) + i) % m;
count++;
}
printf("Case %d: %d\n",c++,count);
}
return0;
}
//5173 3849 3279 1511 9111 5309 6000 1234 1079 2136 9999 1237
问题:1.数组是固定大小,会造成浪费
2.又忘记了0,0,0终止的简单写法
改进code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cstdio>
#include<iostream>
#include<math.h>
#include <map>
using namespace std;
int main(){
int z,i,m,l;
int c = 1;
while (scanf("%d%d%d%d",&z,&i,&m,&l) && (z+i+m+l)) {
int sum = 0;
int *num = new int[m];
memset(num, 0, m*sizeof(num));
sum = l;
int count = 1;
while(1){
if(num[sum] != 0) {
count -= num[sum];
break;
}
num[sum] = count;
sum = ((z * sum) + i) % m;
count++;
}
printf("Case %d: %d\n",c++,count);
delete [] num;
}
return 0;
}
/*
7 5 12 4
5173 3849 3279 1511
9111 5309 6000 1234
1079 2136 9999 1237
0 0 0 0
*/