ZOJ Problem Set

这道题目不难,是一道简单的进制转换问题,但是发现了自己两个遗漏的知识点:

1.关于scanf

(1)scanf函数在输入时是以回车或者空格作为一次输入的结束

(2)scanf函数在输入字符串的过程中是不吸纳空格的,而且如果输入是整数或者浮点数,前面的空格对输入没有影响,如下:

    char s1[100],s2[100];
    int a,b;
    scanf("%s%s%d%d",s1,s2,a,b);
    printf("%s%s%d%d",s1,s2);

如上面这段代码,如果给定输入为:"    ACM    ACM      1 2     "

则输出为:"ACMACM12"

2.关于gets

(1)gets函数是可以吸纳空格的

(2)如果利用gets读取文件中的字符串,可以利用如下代码作为结束:

while(gets(str)!=NULL)
{}

3.关于reverse函数,特别标注下,以前用过后来忘掉了,在algorithm中

下面是ac代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int main()
{
    char src[100];
    int base1,base2;
    while(scanf("%s%d%d",src,&base1,&base2)!=EOF)
    {
        int i,len=strlen(src),sum=0;
        for(i=0;i<len;i++)
        {
            if(src[i]>='0'&&src[i]<='9')
                sum=sum*base1+src[i]-'0';
            else
                sum=sum*base1+src[i]-55;
        }
        i=0;
        while(sum)
        {
            int t=sum%base2;
            if(t<10)
                src[i++]=t+'0';
            else
                src[i++]=t+55;
            sum/=base2;
        }

        if(i>7)
            printf("  ERROR
");
        else
        {
            while(i<7)
            {
                src[i++]=' ';
            }
            reverse(src,src+i);
            src[i]='';
            printf("%s
",src);
        }
    }

    return 0;
}

关于进制转换的方法:统一转换为10进制然后取余得到每一位,至于怎样把其它进制转换到十进制,见上面代码(是个基本问题不多解释了)

原文地址:https://www.cnblogs.com/xlturing/p/3351888.html