面向信息时代的计算机数学
CINTA作业一
- 用 C 语言编程实现判断输入为偶数的函数,即如果输入为偶数,返回 T rue,否则 返回 Fal
bool pan(int x) {
if (x % 2 == 0)
return True;
return False;
}
- 给定一个整数 v,如何判断 v 是否 2 的某次方?比如,v = 4 = 22,返回 T rue; v = 9 = 23 + 1 并非 2 的次方,返回 False。请写一个 C 语言的函数来实现以上功能。
bool jud(int x) {
if (x == 0)
return 0;
while ((x - ((x >> 1) << 1)) == 0) {
x = x >> 1;
}//先把二进制低位的0去掉
x = x >> 1;
if (x != 0)
return false;
else
return true;
//再把一位1去掉,如果还有1就不是2的某次方
}
后来在leetcode(231. Power of Two)上交的AC代码是这样子的
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n <= 0)//2的多少次方也不可能是负数,加个判定
return 0;
while ((n ^ ((n >> 1) << 1)) == 0) {//把减法换成异或超越百分之一百的人
n =n >> 1;
}
n = n >> 1;
if (n != 0)
return false;
else
return true;
}
};
- 用 C 语言编程实现一种迭代版本的简单乘法。
#include <iostream>
using namespace std;
int mul(int a, int b) {
if (b < 0) {
a = -a;
b = -b;
}
if (b == 0)
return 0;
int sum = 0;
while (b != 1) {
if (b % 2) {
sum += a;
a = a << 1;
} else {
a = a << 1;
}
b /= 2;
}
return sum + a;
}
int main() {
int a, b, sum = 0;
cin >> a >> b;
cout << mul(a, b);
return 0;
}
- 证明命题1.1。
命题 1.1. 整除性 ♠ 设 a, b, c ∈ Z,如果 a | b,b | c,则 a | c。如果 c | a,c | b,则对任意 m, n ∈ Z,有 c | (ma + nb)。
证明:由如果 a | b,b | c,则 a | c可知
因为对任意m, n ∈ Z,a | ma ,b | nb,又因为c | a,c | b,所以c | ma,c | nb
又因为分配律,所以c | (ma+nb)
- 证明任意形如 111 ⋅ ⋅ ⋅ 111 ∣ z n 111 · · · 111 | {z } n 111⋅⋅⋅111∣zn 的整数都不是平方数,n > 2。
证明:从列一个平方乘法的竖式开始,例如yx_*yx_
要想结果个位为1,横线处只能填1或9
要是填9的话,十位的结果是x*9+x*9+8,则十位一定不能是1
要是填1的话,十位的结果是x*1+x*1,则十位一定不能是1
因为十位都没有可能是1所以一定没有一个由n个1组成的整数是平方数
*群里补加题(leetcode 371. Sum of Two Integers)
int getSum(int a, int b) {
while (b != 0) {
int c = a;
a = a ^ b;
b = (unsigned int)(c & b) << 1;
//不加unsigned int的话leetcode 上会有最高符号位的报错
}
return a;
}