进制转换以及万进制与亿进制的思路

进制转换

这里主要是十进制到二进制至十六进制之间的转换

#include<iostream>
#include<string>
#include<vector>
using namespace std;
static string str = "0123456789ABCDEF";
int main()
{
 int n,base;
 cin >> n >> base;
 vector<char> decade;
 decade.push_back('-');
 int len = 1;
 while (n)
 {
  decade.push_back(str[n % base]);
  n = n / base;
  len++;
 }

转换后的结果与实际的结果顺序是相反的,如果需要输出的话,逆序就可以了

亿进制的思路

这里是引用
万进制核心思想:
用数组储存数值,将每个数组元素当成“大数”的一位数,如果元素值大于9999,则要进位,进位的值为元素值%10000;这也可以理解为一个“万进制”,可以存储的值,就相当于十进制的每一位从010变成了09999,就等同于从十进制变成了万进制。
如:662343889 * 5 = 3311719445
那么如果用万进制计算:可以设一个数组a[3]; a[2] = 3889 ; a[1] = 6234 ; a[0] = 6 ;
第一步:a[2] * 5 = 19445 ; 19445 %10000 = 1余9445 9445留下,1进位;
第二步:a[1] * 5 = 31170 ; 31170 %10000 = 3余1170 1170留下,加上进位的1为1171(终值),3进位;
第三步:a[0] * 5 = 30 ; 30+3(进位)为终值。
按顺序输出得:3311719945 ;仅仅三步我们便得出了最后结果,如果用十进制呢?每位相加,对于本例,至少要十步。效率快了3倍不止。
亿进制核心思想
用数组储存数值,将每个数组元素当成“大数”一位数,如果元素值大于99999999,则要进位,进位的值为元素值%100000000;这也可以理解为一个“亿进制”,可以存储的值,就相当于十进制的每一位从010变成了099999999,就等同于从十进制变成了亿进制。
效率:
n取=100000时,大概要输出2.1w位。
十进制:10w位的C语言程序运行时间在7s左右,未测试C++运行时间
万进制:10w位C语言的运行时间在2.1s左右,C++运行时间2.7s左右
亿进制:10w位的C语言运行时间1.2s左右,C++运行时间2.0s左右。
结论1:超大量计算时,c++要比c慢一些。
结论2:万进制的高效显而易见了,尤其是亿进制, 须知程序运行的时限一般在1秒或3秒,尤其是对于代码效率要求很高的题。多出0.几秒,通过概率会提高很多。

具体代码实现
输入:
n (第n为斐波那契数。)
输出:
输出该数。
万进制代码

#include<stdio.h>
int main() {
int a1[10000], a2[10000], a3[10000];//a1为第n个数,a2为第n-1个数,a3做中间变量转换a1和a2
int n; scanf("%d", &n);
int places = 0, carry, i, j; //places是总位数,carry是进位
for(i = 0; i < n; i++) {
carry = 0;
if(i == 0 || i == 1) a1[0] = a2[0] = 1;
else {
for(j = 0; j <= places; j++) {
a3[j] = a1[j]; //做变量转化,a3做中间变量
a1[j] += a2[j]; a1[j] += carry; //不仅要加前一个数,还要加上次运算后的进位。
carry = a1[j]/10000; //求进位
a1[j] %=10000;
a2[j] = a3[j]; //变量转换,a3做中间变量
}
if(carry > 0) { //如果进位>0,则总位数+1。
places++;
a1[places] = carry;
}
}
}
printf("%d",a1[places]);
for(i = (places-1); i >= 0; i–)
printf("%04d", a1[i]); //域宽为4,不够补0
return 0;
}

亿进制代码

#include<stdio.h>
int main() {
 int a1[3000], a2[3000], a3[3000];
 int places = 0, carry, i, j;
 int n; scanf("%d", &n);
 for(i = 0; i < n; i++) {     //核心循环
  carry = 0;
  if(i == 0 || i == 1) a1[0] = a2[0] = 1;
  else {
   for(j = 0; j <= places; j++) {
    a3[j] = a1[j];      //做变量转化
    a1[j] += a2[j]; a1[j] += carry;  //三行核心代码
    carry = a1[j]/100000000;
    a1[j] %=100000000;
    a2[j] = a3[j];      //变量转换
   }
   if(carry > 0) { places++; a1[places] = carry; }
  }
 }
 printf("%d",a1[places]);
 for(i = (places-1); i >= 0; i–)
  printf("%08d", a1[i]);
 return 0; 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值