数学问题(二)

一、进制转换

从m进制转换到n进制 : ①从m进制转换到十进制 ②从十进制转换到n进制
十进制转换到其他进制

x = b0* 2^0 +b1*2^1……

应用上章数位拆解的方法得到 b0,b1,b2:

x%2=b0

这样就得到了该数字由二进制表示时的最低数位。然后不断对x做整除,除2,同样可以将高位数字向低位移动

 x/2 = b1*2^0 +b2*2^1……

将二进制数表示为十进制比较容易

题目一:
A+B
输入两个不超过整形定义的非负十进制整数,求和后,输出它的m进制数—–(十进制转化为其他进制)
两个int数字的和可能会超过int所能表达的最大数字,出现溢出,所以这里使用 long long

 do{
        ans[size++] = a%m;
        a/=m;
       }while(a!=0);

这里保证了,即使该整数是0,也能够进行转换
完整代码:

#include<stdio.h>
int main()
{
     long long a,b;
     int m;
     while(scanf("%d",&m)!=EOF)
     {
       if(m==0) break;
       scanf("%lld%lld",&a,&b);
       a = a+b;
       int ans[50],size = 0;
       //保证转换工作至少执行一次,那么即使是0,程序也能正常工作
       do{
        ans[size++] = a%m;
        a/=m;
       }while(a!=0);
       int i = size-1;
       for(i = size-1;i>=0;i--)
       {
        printf("%d",ans[i]);
       }
       printf("\n");

     }
     return 0;
}

题目二:
数制转换: 由a进制转化为b进制

将a进制数字转化为10进制,并用tmp保存起来

int tmp,lenth = strlen(str),c=1;
    int i,j;
    for(i=lenth-1;i>=0;i--)
    {
       int x;
      if(str[i]>='0' && str[i] <='9')
        x = str[i] - '0';
      else if(str[i]>='a' && str[i]<='z')   //字符转化为整数
        x = str[i]-'a'+10;
      else
        x = str[i]-'A'+10;
      tmp +=x*c;
      c*=a;
    }

将十进制转化为b进制,并转化为字符串输出

char ans[40],size = 0;
    do{
        int num = tmp%b;
        ans[size++] = (num<10) ? num+'0' : num-10+'A';  //数字转化为字符
        tmp /=b;
    }while(tmp!=0);
    for(j=size-1;j>=0;j--){
         printf("%c",ans[j]);
    }

题目二:
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。(这里注意30)
大整数的进制转换
首先来看一个例子。
十进制的123456789 转为 二进制,注意这里要手工算。
这里写图片描述

//大整数除法,模拟除以2的过程,直到各个位都为0
int devide(int len)
{
    int carray = 0;
    for(int i=0;i<len;i++)
    {
        int num = ((carray*10)+srci[i])/2;
        carray = srci[i]%2;
        srci[i] = num;
    }
    return carray;
}
//判断srci是否为0  
bool isZero(int len)  
{  
    for (int i=len-1; i>=0; i--)  
    {  
        if (srci[i] != 0)  
        {  
            return false;  
        }  
    }  
    return true;  
}  
#include <stdio.h>
    char str[200]={0};
int stri[200]={0};
char res[200]={0};
//大整数除法
int devide(int len)
{
    int carray = 0;
    int i;
    for(i=0;i<len;i++)
    {
        int num = ((carray*10)+stri[i])/2;
        carray = stri[i]%2;
        stri[i] = num;
    }
    return carray;
}
//最后为0得情况
int isZero(int len)
{
   int i;
   for(i=len-1;i>=0;i--)
   {
     if(stri[i]!=0)
         return 0;
   }
    return 1;
}
int main () {
    while(scanf("%s",str)!=EOF)
    {
       int len = 0;
       while(str[len]!=0)
       {
          stri[len] = str[len]-'0';  //字符转化为数字
           len++;
       }
        int index=0;
        do{
            res[index++] = devide(len)+'0'; //数字转化为字符表示

        }while(!isZero(len));

        int i;

        for(i=index-1;i>=0;i--)
        {
            printf("%c",res[i]);
        }
        printf("\n");
    }
    return 0;
}

题目三:
八进制
输入一个整数,将其转换成八进制数输出。
输入包括一个整数N(0<=N<=100000)。 (1024)

#include<stdio.h>
//输入一个整数N,输出其八进制表示
    int ans[200] = {0};
int main()
{
  int N;
  while(scanf("%d",&N)!=EOF)
  {
      int size=0;
      do{
        ans[size++] = N%8;
        N/=8;
      }while(N!=0);
      int i=0;
      for(i=size-1;i>=0;i--)
      {
        printf("%d",ans[i]);
      }
      printf("%\n");
  }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值