您的位置:首页 > 其它

奇妙的数学

2014-03-24 00:52 127 查看
1. 约瑟夫(环)问题。

见于:/article/6305119.html

(数学推理部分开始)

2. 不用任何中间变量交换两个变量 a 和 b 的值。

方法1: 方法2:(适用整型)

a = a + b; a = a ^ b;

b = a - b; b = a ^ b;

a = a - b; a = a ^ b;

3. 不用加减乘除求两个整数的和。

求整数 a,b 的和:

步骤A:令 s = a ^ b,将所有位相加,有进位处置 0 (相当于舍弃进位相加)。—>步骤B

步骤B: 令 d = a & b,则求出所有进位,

若 d == 0,则无进位,返回 s;

若 d != 0,则返回(d << 1) + s 。即将所有进位左移一位,将问题化成 (d << 1) 与 s 求和的问题。可令 a = d << 1,b = s,—>步骤A

例如:a = 5,b = 13 时:计算机内表示为,a =0101,b = 1101,

步骤A: s = a ^ b = (0101) ^ (1101) = 0 1000. —>步骤B

步骤B: d = a & b = (0101) & (1101) = 0101。 1,3 位有进位,d != 0,于是 a = s = 1000,b = d << 1 = 0101,—>步骤A2

步骤A2: s = a ^ b = (1000) ^ (0101) = 1101。—>步骤B2

步骤B2: d = a & b = (1000) & (0101) = 0000。d == 0 ,无进位,返回 s = 1101. 即 13

注:负数在计算机中用补码表示,但是负数之间也满足这种求和方法。正数与负数之间求和也适用于此方法)

代码:

/********** 注:超出边界时溢出 *************/
int add(int num1, int num2)
{
int sum = num1 ^ num2;
while(num1 & num2)
{
num1 = (num1 & num2) << 1;
num2 = sum;
sum = num1 ^ num2;
}
return sum;
}

int main()
{
std::cout << add(0x7fffffff >> 1, (0x7fffffff >> 1)+1) << std::endl;
return 0;
}


结果:

#include <iostream>
#include <string>
using namespace std;
string day[] = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
int base[7][7];
int circle[7] = {1, 1, 3, 6, 3, 6, 2};

inline void init()
{
for(int i = 1; i < 7; ++i)
{
int step = 1;
base[i][0] = step % 7;
for(int j = 1; j < 7; ++j)
{
step *= i;
base[i][j] = step % 7;
}
}
}

int main()
{
int N;
init();
while(cin >> N)
{
int sum = 0;
N = N % 294;
while(N)
{
int t1 = N % 7;
int t2 = N % circle[t1];
sum = (sum + base[t1][t2]) % 7;
--N;
}
cout << (day[sum]) << endl;
}
return 0;
}


View Code



附:n x n 的正方形中,有多少长方形? 答案: C(n+1, 2)2-n(n+1)(2n+1)/6 = n(3n+2)(n2-1)/12 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: