#M9024. 初等数论

初等数论

当前没有测试数据。

  1. 完善程序:

(哥德巴赫猜想)哥德巴赫猜想是指,任一大于2的偶数都可写成两个质数之和。迄今为止,这仍然是一个著名的世界难题,被誉为数学王冠上的明珠。试编写程序,验证任一大于2且不超过n的偶数都能写成两个质数之和。

image

若输入n为2010,则输出[ ⑤ ]时表示验证成功,即大于2且不超过2010的偶数都满足哥德巴赫猜想。

第一空:{{ input(1) }}
第二空:{{ input(2) }}
第三空:{{ input(3) }}
第四空:{{ input(4) }}
第五空:{{ input(5) }}

  1. 下面是根据欧几里得算法编写的函数,它所计算的是a和b的?

image

{{ select(6) }}

  • 最大公共质因子
  • 最小公共质因子
  • 最大公约数
  • 最小公倍数

  1. 阅读程序写结果:

image

输入:30
输出:_____
{{ input(7) }}

  1. 10000 以内,与 10000 互质的正整数有( )个? {{ select(8) }}
  • 2000
  • 4000
  • 6000
  • 8000

  1. 完善程序

(最大公约数之和)下列程序想要求解整数n的所有约数两两之间最大公约数的和对 10007 求余后的值,试补全程序。举例来说,4 的所有约数是 1, 2, 4 。1 和 2 的最大公约数为 1 ;2 和 4 的最大公约数为 2 ;1 和 4 的最大公约数为 1 。于是答案为1+2+1=4。 要求getDivisor函数的复杂度为O(n)O(√n),gcd 函数的复杂度为O(logmax(a,b))O(logmax(a,b))

image

第一空:{{ input(9) }}
第二空:{{ input(10) }}
第三空:{{ input(11) }}
第四空:{{ input(12) }}
第五空:{{ input(13) }}

  1. 100以内最大的素数是? {{ select(14) }}
  • 89
  • 97
  • 91
  • 93

  1. 319和377的最大公约数是? {{ select(15) }}
  • 27
  • 33
  • 29
  • 31

  1. 干支纪年法是中国传统的纪年方法,由10个天干和12个地支组合成60个天干地支。由公历年份可以根据以下公式和表格换算出对应的天干地支。 天干 =(公历年份)除以10所得余数 地支 =(公历年份)除以12所得余数

image

例如,今年是 2020 年,2020 除以 10 余数为 0,查表为"庚”;2020 除以 12,余数为 4,查表为“子” 所以今年是庚子年。 请问 1949 年的天干地支是( ). {{ select(16) }}

  • 己酉
  • 己亥
  • 己丑
  • 己卯

  1. (质因数分解)给出正整数 𝑛n,请输出将 n 质因数分解的结果,结果从小到大输出。 例如:输入 n=120,程序应该输出 2 2 2 3 5,表示:120=2×2×2×3×5。输入保证 2n1092≤n≤10^9。提示:先从小到大枚举变量 i,然后用 i 不停试除 n 来寻找所有的质因子。 试补全程序。
1 	#include <cstdio>
2 	using namespace std;
3 	int n, i;
4 
5 	int main() {
6 	  scanf("%d", &n);
7 	  for(i = ①; ② <=n; i ++){
8 		③{
9 		  printf("%d ", i);
10		  n = n / i;
11		}
12	  }
13	  if(④)
14		printf("%d ", ⑤);
15	  return 0;
16	}

1)①处应填{{ select(17) }}

  • 1
  • n-1
  • 2
  • 0

2)②处应填{{ select(18) }}

  • n/i
  • n/(i*i)
  • i*i
  • i*i*i

3)③处应填{{ select(19) }}

  • if(n%i==0)
  • if(i*i<=n)
  • while(n%i==0)
  • while(i*i<=n)

4)④处应填{{ select(20) }}

  • n>1
  • n<=1
  • i<n/i
  • i+i<=n

5)⑤处应填{{ select(21) }}

  • 2
  • n/i
  • n
  • i

  1. 填空题
1 	#include <stdio.h>
2 
3 	#define n 100000
4 	#define	N n+1
5 
6 	int m;
7 	int a[N], b[N], c[N], d[N];
8 	int f[N], g[N];
9 
10	void init() 
11	{
12		f[1] = g[1] = 1;
13		for (int i = 2; i <= n; i++) {
14			if (!a[i]) {
15				b[m++] = i;
16				c[i] = 1, f[i] = 2;
17				d[i] = 1, g[i] = i + 1;
18			}
19			for (int j = 0; j < m && b[j] * i <= n; j++) {
20				int k = b[j];
21				a[i * k] = 1;
22				if (i % k == 0) {
23					c[i * k] = c[i] + 1;
24					f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
25					d[i * k] = d[i];
26					g[i * k] = g[i] * k + d[i];
27					break;
28				}
29				else {
30					c[i * k] = 1;
31					f[i * k] = 2 * f[i];
32					d[i * k] = g[i];
33					g[i * k] = g[i] * (k + 1);
34				}
35			}
36		}
37	}
38
39	int main() 
40	{
41		init();
42		
43		int x;
44		scanf("%d", &x);
45		printf("%d %d\n", f[x], g[x]);
46		return 0;
47	}

假设输入的x是不超过1000的自然数,完成下面的判断题和单选题:

判断题

1)若输入不为”1”,把第12行删去不会影响输出的结果。{{ select(22) }}

  • 正确
  • 错误

2)第24行f[i * k] = f[i] / c[i * k] * (c[i * k] + 1)中的” f[i]/c[i*k]”可能存在无法整除而向下取整的情况。{{ select(23) }}

  • 正确
  • 错误

3)在执行完init()后,f数组不是单调递增的,但g数组是单调递增的。{{ select(24) }}

  • 正确
  • 错误

单选题

4)init函数的时间复杂度为?{{ select(25) }}

  • O(n)O(n)
  • O(nlogn)O(nlogn)
  • O(nn)O(n√n)
  • O(n2)O(n^2)

5)在执行完init() 后,f[1],f[2],f[3]......f[100]中有()个等于2?{{ select(26) }}

  • 23
  • 24
  • 25
  • 26

6)当输入”1000”时,输出为?{{ select(27) }}

  • ”15 1340”
  • ”15 2340”
  • ”16 2340”
  • ”16 1340”

  1. (枚举因数)从小到大打印正整数 n 的所有正因数。 试补全枚举程序。
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int main() {
05   int n;
06   cin >> n;
07
08   vector<int> fac;
09   fac.reserve((int)ceil(sqrt(n)));
10
11   int i;
12   for (i = 1; i * i < n; ++i) {
13     if (①) {
14       fac.push_back(i);
15     }
16   }
17
18   for (int k = 0; k < fac.size(); ++k) {
19     cout << ② << " ";
20   }
21   if (③) {
22     cout << ④ << " ";
23   }
24   for (int k = fac.size() - 1; k >= 0; --k) {
25     cout << ⑤ << " ";
26   }
27 }

1)①处应填?{{ select(28) }}

  • n % i == 0
  • n % i == 1
  • n % (i-1) == 0
  • n % (i-1) == 1

2)②处应填?{{ select(29) }}

  • n / fac[k]
  • fac[k]
  • fac[k]-1
  • fn / (fac[k]-1)

3)③处应填?{{ select(30) }}

  • (i-1) * (i-1) == n
  • (i-1) * i == n
  • i * i == n
  • i * (i-1) == n

4)④处应填?{{ select(31) }}

  • n-i
  • n-i+1
  • i-1
  • i

5)⑤处应填?{{ select(32) }}

  • n / fac[k]
  • fac[k]
  • fac[k]-1
  • n / (fac[k]-1)

  1. 填空题

image

假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。

判断题

1)如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和。{{ select(33) }}

  • 正确
  • 错误

2)第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次。{{ select(34) }}

  • 正确
  • 错误

3)如果输入的n为质数,solve2(n)的返回值为n2+1n^2+1。{{ select(35) }}

  • 正确
  • 错误

单选题

4)如果输入的n为质数p的平方,那么solve2(n)的返回值为{{ select(36) }}

  • p2+p+1p^2+p+1
  • n2+n+1 n^2+n+1
  • n2+1n^2+1
  • p4+2p2+1p^4+2p^2+1

5)当输入为正整数时,第一项减去第二项的差值一定?{{ select(37) }}

  • 大于0
  • 大于等于0且不一定大于0
  • 小于0
  • 小于等于0且不一定小于0

6)当输入为5时,输出为?{{ select(38) }}

  • 651 625
  • 650 729
  • 651 676
  • 652 625