3.5 杭电复试题 2006

1.输入一个十进制的数,把它变成八进制,类似的把十进制变成 16 进制, 把十六进制转变为十进制等。

#include<stdio.h>
#include<math.h>
int i,j;
char sixteen[10000];
//十进制转化成八进制
int tentoeight(int a)
{
    int res=0,k=0;
    while(a)
    {
        res+=a%8*((int)pow(10,k));
        k++;
        a/=8;
   //     printf("%d\n",res);
    }
    return res;
}
//十进制转化成十六进制
void tentosixteen(int a)
{
    int k=0;
    while(a)
    {
        if(a%16>9)
            sixteen[k++]=a%16+55;
        else
            sixteen[k++]=a%16+'0';
        a/=16;
    }
    for(i=k-1;i>=0;i--)
        printf("%c",sixteen[i]);
    printf("\n");
}
//十六进制转化成十进制
void sixteentoten(char *sixt)
{
    int res=0;
    int l=strlen(sixt);
    for(i=0;i<l;i++)
    {
        if(sixt[i]>='0'&&sixt[i]<='9')
            res+=(sixt[i]-'0')*(int)pow(16,l-i-1);
        else
            res+=(sixt[i]-55)*(int)pow(16,l-i-1);
    }
    printf("%d\n",res);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("十进制转换成八进制:%d\n",tentoeight(n));
        printf("十进制转化成十六进制:");
        tentosixteen(n);
    }
    return 0;
}

这题目有些诡异,因为是回忆版,所以没有规定的输入输出,于是写了三个函数,十进制转化成八进制,转化成十六进制,跟十六进制转化成十进制。输出输入什么的就不计较了啊哈。

#include<stdio.h>
int n;
void main()
{
    while(scanf("%d",&n)!=EOF)
    {
        printf("十进制转化成八进制后为:%o\n",n);
        printf("十进制转化成十六进制后为:%X\n",n);
    }
}

这种方法是偷懒的方法,是直接利用c语言里面有的输入输出格式就可以实现进制的转换。至于十六进制转化成十进制,就在输入时用%x,然后输出的时候用%d就行。如果%X里面的X大写的话,就说明输出或者输入的十六进制数里面的字母是大写。

 

2.输入两个非常大的整数(完全超出了 int、long 的表示范围),这个整数 的长度可能超过 100 位,计算并输出这两个数相加的结果。(HDU acm 1002 用 string 处理比较好) 

#include<stdio.h>
#include<string.h>
char a[1000],b[1000],res[1000];
int i,j,l1,l2,temp;
void main()
{
    int d,jw=0;               //表示进位
    memset(res,'\0',sizeof(res));
    scanf("%s",&a);
    getchar();
    scanf("%s",&b);
    l1=strlen(a);
    l2=strlen(b);
1    if(l1>=l2)
    {
        d=l1-l2;
        for(i=0;i<d;i++)
            res[i]=a[i];
        for(i=l1-1;i>=d;i--)
        {
            temp=a[i]-'0'+b[i-d]-'0'+jw;
            res[i]=temp%10+'0';
            jw=temp<10?0:1;
        }
        if(jw==1)
            res[d-1]+=1;
        for(i=0;i<l1;i++)
            printf("%c",res[i]);
        printf("\n");
    }
    else
    {
        d=l2-l1;
        for(i=0;i<d;i++)
            res[i]=b[i];
        for(i=l2-1;i>=d;i--)
        {
            temp=b[i]-'0'+a[i-d]-'0'+jw;
            res[i]=temp%10+'0';
            jw=temp<10?0:1;
        }
        if(jw==1)
            res[d-1]+=1;
        for(i=0;i<l2;i++)
            printf("%c",res[i]);
        printf("\n");
    }
}

我觉得判断l1跟l2谁长的后面,代码基本相同,但是暂时没想出来怎么改的更好。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值