winter 2018 02 01 关于模运算的一道题
2018-02-01 21:56
281 查看
题目:给出一个正整数n,问是否存在x,满足条件2^x mod n=1,如果存在,求出x的最小值。
分析:1、若给出的n是1,则肯定不存在这样的x;
2、若给出的是偶数,2的次幂取余一个偶数得到的肯定是给偶数,所以也找不到;
3、若给出的是奇数,其个位的数字无非是3、5、7、9,而2的次幂的个位为2、4、6、8,分别-1为1、3、5、7,即奇数的倍数都能找到相对的,则2的次幂取余每个奇数都会找 到一个合适的幂数满足题意。
代码:
#include <stdio.h>
int main()
{
int n ;
while(scanf("%d",&n)!=EOF)
{
if(n==1 || n%2==0)
{
printf("2^? mod %d = 1\n",n);
}
else
{
int j = 1, mi=2;
while(1)
{
mi %= n ; //让min等于min取余n的余数,因为这个数取余n是否得1与商以无关,接下来只看得到的余数即可。
if(mi == 1)
{
printf("2^%d mod %d = 1\n",j,n) ;
break ;
}
mi *= 2 ;
j++ ;
}
}
}
return 0 ;
}
分析:1、若给出的n是1,则肯定不存在这样的x;
2、若给出的是偶数,2的次幂取余一个偶数得到的肯定是给偶数,所以也找不到;
3、若给出的是奇数,其个位的数字无非是3、5、7、9,而2的次幂的个位为2、4、6、8,分别-1为1、3、5、7,即奇数的倍数都能找到相对的,则2的次幂取余每个奇数都会找 到一个合适的幂数满足题意。
代码:
#include <stdio.h>
int main()
{
int n ;
while(scanf("%d",&n)!=EOF)
{
if(n==1 || n%2==0)
{
printf("2^? mod %d = 1\n",n);
}
else
{
int j = 1, mi=2;
while(1)
{
mi %= n ; //让min等于min取余n的余数,因为这个数取余n是否得1与商以无关,接下来只看得到的余数即可。
if(mi == 1)
{
printf("2^%d mod %d = 1\n",j,n) ;
break ;
}
mi *= 2 ;
j++ ;
}
}
}
return 0 ;
}
相关文章推荐
- 01/29/2018 - 02/04/2018
- APUE读书笔记-02UNIX标准和实现-01简介
- 关于Java多态和继承的一道题
- 数字图像处理实验(1):PROJECT 02-01, Image Printing Program Based on Halftoning
- Spring Security (02) -- 关于登录
- <2013 12 01> 一篇很好的关于windows编程的入门指导(2013年末写的,比较前沿)
- 01.开山-关于Shell一些没用的废话
- UVA - 12063(关于倍数的dp转化成模运算)
- 关于对象的转型02
- 关于android的阅读笔记--01
- 关于支付平台的问题整理01
- GZIP压缩原理分析(17)——第五章 Deflate算法详解(五08) 算法分析(02) 格式说明(01) 块首部
- 20170218C++项目班02_01Node实现
- 学习CUDA_01关于NVIDIA
- 关于arduino 使用 ESP 8266 01 模块初学所遇问题
- 关于RPC方式的C/S程序测试-01
- 关于printf("%d",A)与printf("%02d",A) 类型的printf的格式修饰符
- javaSE知识点--01(02在EditPlus里面配置java编译工具)
- [转]Ultra Fractal教程系列26——关于变换的学习01——添加变换
- 01-UI基础-04-02-UITableView补充