LG 的数学计划 ---- 第二步 进制转换

显然,在了解素数判定之后,我们又跟着 LG 的步伐来到了他的第二步 “进制转换”;

进制转换其实是一种很简单的东西,当然只要你足够了解进制的特点;

现实生活中,我们所使用的都是十进制,(也就逢十进一),好吧,我就不再废话了;

不过,还是要拿十进制的数来举一些例子:

比如 1293781 :

(1293781)= 1 * 10^0 + 8 * 10^1+ 7 * 10^2 +3 * 10^3 + 9 * 10^4 + 2 * 10^5 + 1 * 10^6 ;

那么,找到规律(其实也很好证明):
对于S这个要转化为k进制数的数,不妨设它可以写成:abc…….sdui= i * k^0 + u * k^1 + d * k^2 +…….
那么,对于最后一位的数,我们就只要用S mod k^0 就可以咯~很简单吧~

又有人要问了:这只是最后一位啊,前面的呢?

其实,答案很简单~~~把S去掉最后一位,剩下的新数S’的最后一位不就是我们要求的最后一位了吗?

当然,把S去掉最后一位的具体做法是什么呢?S/k的取整就是S’了~~~~

显然,我们只要把我们每一次得到的最后一位逆序输出,就可以我们要的数了~~~很有趣吧(显然这是一个栈)

下面我们来看代码

#include<bits/stdc++.h>
using namespace std;
int target,a[100010];//target就是我们需要转换的数,a就是存储转换后新数的每一位的
int top,s[1020110];//栈
void get_new_number(int k){//为了方便看,就新开了一个函数
    int x=target;//由于涉及改变值,用临时的x来代替target
    top=0;memset(s,0,sizeof(s));//初始化栈
    while(x){
        s[++top]=x%k;
        x/=k;//根据刚刚的过程入栈
    }
    int i=1;//设置的循环变量
    while(top)
        a[i++]=s[top--];//虽然写的比较迷,但是就是把栈里面的数存出来
    int n=--i;//由于最后一次i++是不需要的,所以要减回来
    for(i=1;i<=n;i++)printf("%d",a[i]);//输出
    printf("\n");
}
int main(){
    int k;
    scanf("%d%d",&target,&k);
    get_new_number(k);
    return 0;
}

简单的东西就到这里结束了,应付大多数问题都是足够了的。那么,大家可以到此为止了。接下来还是要讲一些稍微深奥一点的东西,主要是进位制及转换的应用,大家也可以选择不看的~

首先,对于非十进制数之间的转换,其实是一样的。
对于k进制数K,要是需要转化成n进制数N。那么我们的做法是什么呢?

可以将K的各位数上的数码乘上各自数位上1所代表的数,再依次相加,得到的和就是我们的一个10进制数了,不过,并不是一个用数组分开存的,就是一个数。

做法很简单,不再赘述了。

下面讲一些数学题。(主要是方法的运用)

1.已知正整数n的b进制表示是777,求最小的b,使n是一个整数的四次方。

解题过程如下:
假设b是要求的答案,x(x是正整数)的四次方就是n。
∴7*b^2+7*b+7=x^4=n
∴7|x^47|x
那么,再设m=x/7;
∴7*b^2+7*b+7=(7*m)^4
∴b^2+b+1=7^3*m^4
于是,现在来做一件很神奇的事情:从小到大枚举m的值
于是,又发生了一件很神奇的事----->当m=1时,原方程可以转化成:
b^2+b-342=0
亲爱的因式分解:
(b-18)*(b+19)=0
∴b=18是满足条件最小的值

2.求证:对任何r∈N,r>=6,r进制数123454321是完全平方数。

证明:
设该数为N;
N=r^8+2*r^7+3*r^6+4*r^5+5*r^4+4*r^3+3*r^2+2*r+1
∴N=r^8+r^7+r^6+r^5+r^4
+r^7+r^6+r^5+r^4+r^3
+r^6+r^5+r^4+r^3+r^2
+r^5+r^4+r^3+r^2+r
+r^4+r^3+r^2+r+1
(神奇的事情发生了)
=( r^4 + r^3 + r^2 + r + 1 ) ^ 2
证毕
当然,再补充一句,这个数就是r进制的11111的平方(想想就显然)

3.求所有正整数a,b,c,d使(2^a+2^b)^2=2^c+2^d。

证明:
方程左边可化为:2^(2*a)+2^(a+b+1)+2^(2*b)
那么,考虑到进制表示的唯一性,所以上面这个三项式应该有两项是相等的
那么,不妨设a<=b,c<=d
∴a+b+1>2*a
于是只有两种情况:

①a=b.
∴2^c+2^d=2^(2*a+2)
∴c=d=2*a+1
②a+b+1=2*b
∴b=a+12^(2*a)+2^(2*a+3)=2^c+2^d
∴c=2*a;d=2*a+3

综上所述,其实a,b,c,d的有序解只有5种:
(k,k,2*k+1,2*k+1);
(k,k+1,2*k,2*k+3);
(k,k+1,2*k+3,2*k);
(k+1,k,2*k,2*k+3);
(k+1,k,2*k+3,2*k);
(k是正整数)
剩下的东西大家自行解决吧(其实也没有剩下的了)

于是,我们所有的东西就到这里愉快的结束了,大家是不是觉得很简单呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值