第一题
输入循环群的阶数n,输出该群的生成元。
例如:
输入:24
输出:1 5 7 11 13 17 19 23
注:生成元用空格分隔,(23后面也有一个空格)
代码如下(示例):
#include<stdio.h>
int main()
{
int a;
int i,j,z=0;
scanf("%d",&a);
printf("1 ");
for(i=2;i<a;i++)
{
z=0;
for(j=2;j<=i;j++)
{
if(a%j==0&&i%j==0)
{
z=1;
break;
}
}
if(z==0)
printf("%d ",i);
}
return 0;
}
第二题
对于输入的正整数m,构造剩余类乘法群,输出该群的所有元素,并判断是否是循环群,如果是循环群,输出所有的生成元(升序排序)。
输入输出样例1:
输入:
5
输出:
1 2 3 4 (空格分隔 剩余类群的元素 ,不用加[ ])
Y (表示是循环群)
2 3 (空格分隔循环群的生成元)
输入输出样例2:
输入:
9
输出:
1 2 4 5 7 8 (空格分隔 剩余类群的元素 ,不用加[ ])
Y (表示是循环群)
2 5 (空格分隔循环群的生成元)
输入输出样例3:
输入:
20
输出:
1 3 7 9 11 13 17 19 (空格分隔 剩余类群的元素 ,不用加[ ])
N (表示不是循环群)
代码如下(示例):
#include<stdio.h>
int *isLoopGroup(int a[], int n,int m)
{
static int b[50]={0};
int i,num=0,t,j=1;
for(i=0;i<n;i++)
{
num=0;
t=a[i]*a[i]%m;
while(t!=1)
{
t=t*a[i]%m;
num++;
}
if(num==n-2)
{
b[0]=1;
b[j]=a[i];
j++;
}
}
return b;
}
int main()
{
int m,z,n,i,j,k=1,p=1;
scanf("%d",&m);
int a[50];
int *c;
a[0]=1;
printf("1 ");
for(i=2;i<m;i++)
{
z=0;
for(j=2;j<=i;j++)
{
if(m%j==0&&i%j==0)
{
z++;
break;
}
}
if(z==0)
{
printf("%d ",i);
a[k]=i;
k++;
}
}
n=k;
c=isLoopGroup(a, n, m);
if(c[0]==0)
printf("\nN");
else
printf("\nY\n");
while(c[p]!=0)
{
printf("%d ",c[p]);
p++;
}
return 0;
}
总结
以上为循环群习题的所有内容,大家要认真学习哦。