第一章课后习题
- 用 C 语言编程实现判断输入为偶数的函数,即如果输入为偶数,返回 True,否则返回 False。
void fun(){
int num=0;
scanf("%d",&num);
if(num%2==0) printf("True");
else printf("False");
}
- 给定一个整数 v,如何判断 v 是否 2 的某次方?比如,v = 4 = 22,返回 True; v = 9 = 23 + 1 并非 2 的次方,返回 False。请写一个 C 语言的函数来实现以上功能。
//原本写了个不符合由4开始的,不符合所有条件运算,之后改了:
#include<iostream>
#include<cmath>
using namespace std;
int fun(int num){
if(num%2){
return num;
}
else {
return fun(num/2);
}
}
int main()
{
int v;
cin>>v;
if(fun(v)==1&&v!=1){
cout<<"True"<<endl;
}
else {
cout<<"False"<<endl;
}
return 0;
}
- 用 C 语言编程实现一种迭代版本的简单乘法。
//这里可以根据上一题的思想,将算式调整作数字乘2的n次方,再选择是否加上奇数的值
#include<iostream>
using namespace std;
int multiply(int num,int n){
if(n==0) num=0;
else {
int temp=num;
while(n>1){ //模拟简单乘法
num*=2;
if(n%2){
num+=temp;
}
n/=2;
}
}
return num;
}
int main(){
int a,b;
scanf("%d",&a);
scanf("%d",&b);
if(a<b){ //无中间值的交换数据
a=a+b;
b=a-b;
a=a-b;
}
printf("%d",multiply(a,b));
return 0;
}
- 证明命题1.1:
设 a, b, c ∈ Z,如果 a | b,b | c,则 a | c。如果 c | a,c | b,则对任意 m, n ∈ Z,有c | (ma + nb)。
<1> 设置 m,n ∈ Z,使得 a | b,b | c,则 a | c
因为 a | b 得:b = m*a
又因 b | c 得:c = n*b
则: c = m*n*a
<2> 设置 k1,k2 ∈ Z,使得 c | a,c | b,则:
因为 c | a 得:a = k1*c
又因 c | b 得:b = k2*c
则: m*a = m*k1*c
n*b = n*k2*c
得: (ma + nb)/c = m*k1 + n*k2 (m,n,k1,k2 ∈ Z)
所以 c | (ma + nb)
- 证明任意形如 111 ⋯ 111 ⏟ n \underbrace{111\cdots111}_{n} n 111⋯111 的整数都不是平方数,n > 2。
作为每一位都是1的数字:
那么末尾位置有两种情况:1或者是9
<1> 我们假设末尾位置为9:
设前一位为X:
那么影响后两位的是:X1*X1
根据要求:
2X=3 (末位进8)
不符合题设
<2> 末尾位为1:
设前一位为X:
那么倒数第2位为:1
根据要求:
2X=1
不符合题设
以此向高位类推,不符合题设
另一种解法:(标准答案)
Suppose
a
2
=
111
⋅
⋅
⋅
111
a^2 =111···111
a2=111⋅⋅⋅111, clearly it must be
a
a
a power of odd number (because
a
2
a^2
a2 is an odd number), so
a
a
a is odd.
Let
a
=
2
b
+
1
,
a
2
=
4
b
2
+
4
b
+
1
a=2b+1, a^2=4b^2+4b+1
a=2b+1,a2=4b2+4b+1
4
b
2
+
4
b
+
1
=
1
(
m
o
d
4
)
4b^2+4b+1=1(\mod 4)
4b2+4b+1=1(mod4)
111
⋅
⋅
⋅
111
=
−
1
(
m
o
d
4
)
111···111=-1(\mod 4)
111⋅⋅⋅111=−1(mod4) (where the number of
1
>
2
1>2
1>2, aka
n
>
2
n>2
n>2) QED.