这题想了很久才想出一个做法

在纸上乱写着写着,就出来了

自己也不知道为什么对

2^x mod n = 1
1 #include<iostream>
2 #include <cmath>
3  using namespace std;
4  int isfindtwo(int);
5
6  int main()
7 {
8 int n;
9 int count = 1;
10 int hold;
11 int a;
12 //freopen("test.txt","r", stdin);
13 while (cin >> n)
14 {
15 if (n % 2 == 0 || n == 1)
16 cout << "2^? mod " << n << " = 1" << endl;
17
18 else
19 {
20 if (isfindtwo(n+1))
21 cout << "2^" << isfindtwo(n+1) << " mod " << n << " = 1" << endl;
22 else
23 {
24 hold = (n+1)/2;
25 a = hold + n;
26 while (!isfindtwo(a))
27 {
28 if (a%2 == 0)
29 {
30 a /= 2;
31 count++;
32 }
33 else
34 a += n;
35 }
36 cout << "2^" << count+isfindtwo(a) << " mod " << n << " = 1" << endl;
37 }
38 }
39 count = 1;
40 }
41 return 0;
42 }
43 //查找n是不是2的指数的形式
44 int isfindtwo(int n)
45 {
46 for (int i = 1; ; i++)
47 {
48 if ((int)pow((double)2,(int)i) == n)
49 {
50 return i;
51 }
52 else
53 {
54 if ((int)pow((double)2,(int)i) > n)
55 {
56 return 0;
57 }
58 }
59 }
60 }

 

之后在网上找找别人是如何做的,受到启发,重写了一个

主要用到一个公式 (m*n)%d =( m%d * n%d ) %d

 

2^x mod n = 1

#include
<iostream>
#include
<cmath>
using namespace std;
int isfindtwo(int);

int main()
{
int n;
int count = 0;
int hold;
int a = 1;
//freopen("test.txt","r", stdin);
while (cin >> n)
{
if (n % 2 == 0 || n == 1)
cout
<< "2^? mod " << n << " = 1" << endl;

else
{
while (1)
{
a
<<= 1;
count
++;
if (a > n)
a
%= n;

if (a % n == 1)
break;
}
cout
<< "2^" << count << " mod " << n << " = 1" << endl;

}
count
= 0;
}
return 0;
}

 

相关文章: