第一章课后习题

第一章课后习题


  1. 用 C 语言编程实现判断输入为偶数的函数,即如果输入为偶数,返回 True,否则返回 False。
void fun(){
	int num=0;
	scanf("%d",&num);
	if(num%2==0) printf("True");
	else printf("False");
}

  1. 给定一个整数 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;
}

之后又重新改进适应负数情况:

#include<iostream>
using namespace std;
bool isPowerOfTwo(int n) {
    if(n<=0) return false;
    if(n==1) return true;
    while(n>2){
        if(n%2!=0){
            return false;
        }
        n/=2;
    }
    return true;
}

int main(){
	int v;
	cin>>v;
	cout<<isPowerOfTwo(n)<<endl;
	return 0;
}

  1. 用 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=num<<1;
			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.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) 

  1. 证明任意形如 111 ⋯ 111 ⏟ n \underbrace{111\cdots111}_{n} n 111111 的整数都不是平方数,n > 2。
作为每一位都是1的数字:
	那么末尾位置有两种情况:1或者是9
	
<1> 我们假设末尾位置为9:
	设前一位为X:
		那么影响后两位的是:X1*X1
		根据要求:
			2X=3	(末位进8)
		不符合题设

<2> 末尾位为1:
	设前一位为X:
		那么倒数第2位为:1
		根据要求:
			2X=1
		不符合题设
	以此向高位类推,不符合题设

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值