1. 写一个表达式,分别表示整形变量x的个位和十位
x=x%10
x=x%100/10
2. 假设变量x和n是两个正整数,正常情况下,x/n这个表达式的结果是向下取整,那么如果希望向上取整应该写什么表达式呢
(x+n-1)/n
3.编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:
a.如果a除以b能整除,则最大公约数是b。
b. 否则,最大公约数等于b和a%b的最大公约数。
Euclid算法的证明如下:
对任意m,n属于N,证明gcd(m,n)=gcd(n,m mod n)
先介绍一个引理:
假设 k|a, k|b,则对任意的 x,y ∈ Z, k|(xa+yb)均成立.
证明:
k|a => a=pk, k|b => b==qk (其中 p,q ∈ Z)
于是有 xa+yb=xpk+yqk=(xp+yq)k
因为 k|(xp+yq)k, 所以 k|(xa+yb)
证明:
令k=gcd(m,n),则k|m并且k|n(k|m表示m能被k整除);
令j=gcd(n, m mod n)则j|n并且j| (m mod n);
对于m,可以用n表示为m=pn+(m mod n);
由引理可知j|m(其中x=p,y=1),又j|n,于是j是m和n的公约数(但不一定是最大的);
因为k是m和n的最大公约数,所以必有k>=j;
通过另一种表示形式:(m mod n)=m-pn,同理可得:
k|(m mod n),有k|n,于是k是(m mod n)和n的公约数(也不一定是最大的);
同样由j是n和(m mod n)的最大公约数可以得到j>=k;
由常识,得出结论k=j,
即gcd(m,n)=gcd(n,m mod n).得证。
4. 用rand函数生成[10,20]之间的随机数,表达式应该怎么写?