《CINTA》第一章 课后练习题

第一章练习题

 

程序题

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,k0Z,使得 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=k0kak0kZ

证毕。

第二部分

∃   k , k 0 ∈ Z \exist\ k,k_0\in \Z  k,k0Z,使得 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)cmk+nk0Z

证毕。
 

5.完成定理 1.1 的证明(除法算法)

证明:

存在性

构造集合

S = { a − b k : k ∈ Z 且 a − b k ≥ 0 } . S = \{ a-bk:k \in \Z 且 a-bk \geq 0 \}. S={abk:kZabk0}.

显然,集合 S S S 非空。由良序原则, 存在一个最小元 $ r \in S$ ,且 r = a − q b r = a- qb r=aqb。因此, a = q b + r , r ≥ 0 a=qb+r,r\geq0 a=qb+r,r0

为证明 0 ≤ r < b 0 \leq r < b 0r<b ,设 r ∈ S   且   r   为   S   中 的 最 小 元 以 及   r ≥ b r \in S \ 且 \ r\ 为\ S\ 中的最小元以及\ r \geq b rS  r  S  rb。则有 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,qZ

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<br,矛盾。

唯一性

设对于整数对 q , r ∈ Z q,r \in \Z q,rZ ∃   q 0 ≠ q , r 0 ≠ r ∈ Z \exist\ q_0\neq q,r_0 \neq r\in \Z  q0=q,r0=rZ ,使得对于任意给定 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>0Z,使  a=qb+r,a=q0b+r0 同时成立。
显然, ∃ k ∈ Z , \exist k \in \Z, kZ, 使得 k = q − q 0 k = q-q_0 k=qq0
故有 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>0r0b; k<0r0<0;
当且仅当 k = 0 时 , 0 ≤ r = r 0 < b k = 0时,0\leq r= r_0 < b k=00r=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} 2n2n1=2n1, 该算法该是 O ( 2 n ) O(2^n) O(2n) 的。

对于简单除法,显然是 O ( n ) O(n) O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是50种不同国家的语言表达“我爱你”: 1. English - I love you 2. Spanish - Te quiero 3. French - Je t'aime 4. German - Ich liebe Dich 5. Italian - Ti amo 6. Portuguese - Eu te amo 7. Russian - Ya lyublyu tebya 8. Chinese (Mandarin) - Wo ai ni 9. Japanese - Aishiteru 10. Korean - Sarang hae 11. Arabic - Ana behibak (to a male) / Ana behibek (to a female) 12. Dutch - Ik hou van je 13. Danish - Jeg elsker dig 14. Swedish - Jag älskar dig 15. Norwegian - Jeg elsker deg 16. Finnish - Minä rakastan sinua 17. Polish - Kocham Cię 18. Czech - Miluji Tě 19. Hungarian - Szeretlek 20. Bulgarian - Obicham te 21. Greek - S'ayapo 22. Turkish - Seni seviyorum 23. Romanian - Te iubesc 24. Croatian - Volim te 25. Serbian - Volim te 26. Slovenian - Ljubim te 27. Slovak - Milujem Ťa 28. Estonian - Ma armastan sind 29. Latvian - Es tevi mīlu 30. Lithuanian - Aš tave myliu 31. Icelandic - Ég elska þig 32. Albanian - Te dua 33. Thai - Phom rak khun (to a male) / Chan rak khun (to a female) 34. Vietnamese - Anh ye^u em (to a female) / Em ye^u anh (to a male) 35. Indonesian - Saya cinta padamu 36. Filipino - Mahal kita 37. Hindi - Main tumse pyar karta hoon 38. Bengali - Ami tomake bhalobashi 39. Urdu - Main tumse muhabbat karta hoon 40. Marathi - Me tujhe pyaar kartaa hoo 41. Punjabi - Main tere pyar da haan 42. Telugu - Nenu ninnu premisthunnanu 43. Tamil - Naan unnai kaadhalikken 44. Malayalam - Njan ninnodenikkoo 45. Kannada - Naanu ninna preetisuttene 46. Gujrati - Hu tane pyar karoo chu 47. Nepali - Ma timilai maya garchu 48. Sinhala - Mama oyata arderyi 49. Burmese - Chit pa de 50. Mongolian - Bi chamd hairtai

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值