第一章练习题
程序题
1.用C语言编程实现判断输入为偶数的函数,即如果输入为偶数,返回True, 否则返回 False。
程序中 isOdd(int num)
函数正是所求函数,自行选择阅读。
/* 一个测试奇偶性的程序 (假定输入的整数不溢出)
* 输入:一个不大于 MAXNUM 的整数
* 输出:带有对奇偶性进行判断的语句
*/
#include<stdio.h>
enum { true = 1, false = 0 };
typedef _Bool bool;
bool isOdd(int num)
{
if (num & 1) return true;
else return false;
}
int main()
{
int num = 0;
//设置数据
printf("Please enter a number to test if it's odd or not:");
scanf("%d", &num);
//设置输入
if (isOdd((int) num))
printf("Yes, %d is an odd number!\n", num);
else
printf("No, %d isn't an odd number!\n", num);
return 0;
}
2.给定一个整数 v
, 判断 v
是否
2
2
2 的某次方? 比如
v
=
4
=
2
2
v = 4 = 2^2
v=4=22 ,返回 True ;
v
=
9
=
2
3
+
1
v = 9 = 2^3 +1
v=9=23+1 并非
2
2
2 的次方,返回 False。请写一个C语言的函数来实现以上功能。
程序中 isPowOf2(int num)
函数正是所求函数,自行选择阅读。
/* 一个测试整数是否为 2 的某次方 (假定输入的整数不溢出)
* 输入:一个整数
* 输出:与求解的结果对应的判断的语句
* 思路:检查 2 进制下的整数中有多少个 1,如果 1 的个数多于一个,那么整数必然不是 2 的某次方
*/
#include<stdio.h>
typedef _Bool bool;
bool isPowOf2(int num)
{
int nOfOne = 0;
while (num > 0 && nOfOne <= 1) {
if (num & 1) nOfOne++;
num >>= 1;
}
return (nOfOne == 1);
}
int main()
{
int num = 0;
printf("Please enter a number: ");
scanf("%d", &num);
if (isPowOf2(num))
printf("Yes, %d is some power of 2.\n", num);
else
printf("No, %d isn't some power of 2.\n", num);
return 0;
}
3.用C语言实现一种迭代版本的简单乘法。
如下 multiply(int na, int nb)
函数即为所求函数,自行选择阅读。
/* 简单乘法器(程序默认输入,输出均不会发生溢出)
* 输入:两个整数 na, nb
* 输出:na * nb 的结果
*/
#include<stdio.h>
typedef long long ll;
ll multiply(int na, int nb)
{
ll ans = 0;
do {
if (nb & 1) ans += na;
na *= 2;
} while (nb >>= 1);
return ans;
}
int main()
{
int na = 0, nb = 0;
ll mul = 0;
printf("Please enter 2 numbers to get them multiplied: ");
scanf("%d%d", &na, &nb);
mul = multiply(na, nb);
printf("The answer of %d * %d is: %d", na, nb, mul);
return 0;
}
证明题
4.证明命题 1.1
证明:
第一部分
设 ∃ k , k 0 ∈ Z \exist\ k,k_0\in \Z ∃ k,k0∈Z,使得 b = k a , c = k 0 b b=ka,\ c=k_0b b=ka, c=k0b,
显然
c = k 0 k a , k 0 k ∈ Z c = k_0ka,k_0k\in\Z c=k0ka,k0k∈Z。
证毕。
第二部分
设 ∃ k , k 0 ∈ Z \exist\ k,k_0\in \Z ∃ k,k0∈Z,使得 a = k c , b = k 0 c a=kc,\ b=k_0c a=kc, b=k0c,
显然
m a + n b = m k c + n k 0 c = ( m k + n k 0 ) c , m k + n k 0 ∈ Z ma+nb = mkc+nk_0c= (mk+nk_0)c,mk+nk_0 \in \Z ma+nb=mkc+nk0c=(mk+nk0)c,mk+nk0∈Z
证毕。
5.完成定理 1.1 的证明(除法算法)
证明:
存在性
构造集合
S = { a − b k : k ∈ Z 且 a − b k ≥ 0 } . S = \{ a-bk:k \in \Z 且 a-bk \geq 0 \}. S={a−bk:k∈Z且a−bk≥0}.
显然,集合 S S S 非空。由良序原则, 存在一个最小元 $ r \in S$ ,且 r = a − q b r = a- qb r=a−qb。因此, a = q b + r , r ≥ 0 a=qb+r,r\geq0 a=qb+r,r≥0 。
为证明 0 ≤ r < b 0 \leq r < b 0≤r<b ,设 r ∈ S 且 r 为 S 中 的 最 小 元 以 及 r ≥ b r \in S \ 且 \ r\ 为\ S\ 中的最小元以及\ r \geq b r∈S 且 r 为 S 中的最小元以及 r≥b。则有 r = q 0 b + r 0 , r 0 < b , q ∈ Z r = q_0b +r_0, \ r_0<b,q\in \Z r=q0b+r0, r0<b,q∈Z 。
a = q b + r = q b + q 0 b + r 0 = ( q + q 0 ) b + r 0 a = qb+r = qb+ q_0b+r_0 = (q+q_0)b+ r_0 a=qb+r=qb+q0b+r0=(q+q0)b+r0 ,显然, ∃ r 0 < b ≤ r \exist \ r_0 < b \leq r ∃ r0<b≤r,矛盾。
唯一性
设对于整数对
q
,
r
∈
Z
q,r \in \Z
q,r∈Z,
∃
q
0
≠
q
,
r
0
≠
r
∈
Z
\exist\ q_0\neq q,r_0 \neq r\in \Z
∃ q0=q,r0=r∈Z ,使得对于任意给定
a
,
b
>
0
∈
Z
,
使
得
a
=
q
b
+
r
,
a
=
q
0
b
+
r
0
a,b>0 \in \Z, 使得\ \ a = qb+r, a=q_0b+r_0
a,b>0∈Z,使得 a=qb+r,a=q0b+r0 同时成立。
显然,
∃
k
∈
Z
,
\exist k \in \Z,
∃k∈Z, 使得
k
=
q
−
q
0
k = q-q_0
k=q−q0,
故有
a
=
q
b
+
r
=
(
q
0
+
k
)
b
+
r
=
q
0
b
+
k
b
+
r
=
q
0
b
+
r
0
a = qb+r =(q_0+k)b+ r = q_0b+kb+r = q_0b+r_0
a=qb+r=(q0+k)b+r=q0b+kb+r=q0b+r0。
显然
r
0
=
k
b
+
r
r_0=kb+r
r0=kb+r。
k
>
0
时
,
r
0
≥
b
;
k
<
0
时
,
r
0
<
0
;
k > 0时,r_0\geq b;\ k<0时,r_0<0;
k>0时,r0≥b; k<0时,r0<0;
当且仅当
k
=
0
时
,
0
≤
r
=
r
0
<
b
k = 0时,0\leq r= r_0 < b
k=0时,0≤r=r0<b。
显然,此时
q
=
q
0
q= q_0
q=q0。
证毕。
6.检验朴素除法与简单除法的正确性,并分别给出他们的算法效率,假定输入为n比特整数。
正确性自证。
假定输入均为n比特整数,则对于朴素除法,循环次数最大可达到
2 n − 2 n − 1 = 2 n − 1 2^n-2^{n-1} = 2^{n-1} 2n−2n−1=2n−1, 该算法该是 O ( 2 n ) O(2^n) O(2n) 的。
对于简单除法,显然是 O ( n ) O(n) O(n) 的