C语言进制转换输出超限问题

题目链接

http://codeup.cn/contest.php?cid=100000579

(是问题B)

题目描述如下

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

输出

可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入 Copy

4 123 10

样例输出 Copy

27

 

我的代码如下

#include<stdio.h>
#define N 100000
long long int ConvertToDecimal(int a,long long int n){
	long long int res=0;
	int p=1;
	while(n!=0){
		res+=n%10*p;
		n=n/10;
		p=p*a;
	}
	return res;
}
int main(){
	int a,b;
	long long int n,res;
	char str[N];
	while(scanf("%d %lld %d",&a,&n,&b)!=EOF){
		int i;
		res=ConvertToDecimal(a,n);
		for(i=0;res!=0;i++){
			str[i]=res%b;
			res/=b;
		}
		for(int j=i-1;i!=0 && j>=0;j--){
			if(str[j]<10) printf("%d",str[j]);
			else printf("%c",str[j]+55);
		}
		if(i==0) printf("0");
		printf("\n");
	}
	return 0;
}

结果是输出超限50

第一次遇到这种错误,而且不知道自己错在哪了(调试很多情况也没发现错误点),求大佬指点迷津

而且题目说n是一个整数,又说给出的数不超过long int范围,所以给出的n应该就是个十进制表示的整数,应该是暗示用long long int 接收就可以,所以错误点应该也不是在这里。

应该是这里有问题。N太大。

最后一个换行不要。

我把N改小了,把换行去掉,还是无法通过

我知道我为什么错了,就是我最后讲的问题,输入也会有字母。现在AC了。谢谢您的回答!

是的。可以参考下面的

#include<stdio.h>
#include <string.h>

/**
 @brief a次方运算
 @param a -[in] 整数a
 @param power -[in] 次方数
 @return a的power次方的值
*/
long NumberToPower(int a, int power)
{
    long res = 1;
    int i = 0;
    for (i = 0; i < power; i++)
    {
        res = res * a;
    }
    return res;
}
/**
 @brief 字符转整数
 @param ch -[in] 字符
 @return 10进制数
*/
int CharacterToInt(char ch)
{
    if (ch == '0')
    {
        return 0;
    }
    else if (ch == '1')
    {
        return 1;
    }
    else if (ch == '2')
    {
        return 2;
    }
    else if (ch == '3')
    {
        return 3;
    }
    else if (ch == '4')
    {
        return 4;
    }
    else if (ch == '5')
    {
        return 5;
    }
    else if (ch == '6')
    {
        return 6;
    }
    else if (ch == '7')
    {
        return 7;
    }
    else if (ch == '8')
    {
        return 8;
    }
    else if (ch == '9')
    {
        return 9;
    }
    else if (ch == 'a' || ch == 'A')
    {
        return 10;
    }
    else if (ch == 'b' || ch == 'B')
    {
        return 11;
    }
    else if (ch == 'c' || ch == 'C')
    {
        return 12;
    }
    else if (ch == 'd' || ch == 'D')
    {
        return 13;
    }
    else if (ch == 'e' || ch == 'E')
    {
        return 14;
    }
    else if (ch == 'f' || ch == 'F')
    {
        return 15;
    }
    return -1;
}
/**
 @brief a进制字符数组转10进制整数
 @param a -[in] a进制
 @param n -[in] 字符数组
 @return 10进制数
*/
long NumberToDec(int a, char *n)
{
    long res = 0;
    int len = strlen(n);
    int i = 0;
    // 次方
    int power = 0;

    for (i = len - 1; i >= 0; i--)
    {
        int tmp = CharacterToInt(n[i]);
        res = res + tmp * NumberToPower(a, power);
        power++;
    }
    return res;
}
/**
 @brief 整数转字符
 @param a -[in] 整数
 @return 字符
*/
char IntToCharacter(int a)
{
    if (a == 0)
    {
        return  '0';
    }
    else if (a == 1)
    {
        return '1';
    }
    else if (a == 2)
    {
        return '2';
    }
    else if (a == 3)
    {
        return '3';
    }
    else if (a == 4)
    {
        return '4';
    }
    else if (a == 5)
    {
        return '5';
    }
    else if (a == 6)
    {
        return  '6';
    }
    else if (a == 7)
    {
        return '7';
    }
    else if (a == 8)
    {
        return '8';
    }
    else if (a == 9)
    {
        return '9';
    }
    else if (a == 10)
    {
        return 'A';
    }
    else if (a == 11)
    {
        return 'B';
    }
    else if (a == 12)
    {
        return  'C';
    }
    else if (a ==13)
    {
        return  'D';
    }
    else if (a == 14)
    {
        return  'E';
    }
    else if (a == 15)
    {
        return 'F';
    }
    return -1;
}
/**
 @brief 10进制数转b进制数组
 @param n -[in] 10进制整数
 @param b -[in] b进制
 @param out -[out] 字符数组
 @return 10进制数
*/
void NumberToDec(long n, int b, char* out)
{
    int res = 0;
    int remainder = n % b;
    int divisorRes = n / b;
    int i = 0;
    int j = 0;
    if (divisorRes == 0)
    {
        res = remainder;
        out[0] = IntToCharacter(res);
        return ;
    }

    out[i] = IntToCharacter(remainder);
    i++;
    while (divisorRes)
    {
        remainder = divisorRes % b;
        out[i] = IntToCharacter(remainder);
        divisorRes = divisorRes / b;
        i++;
    }
    i--;
    for (j = 0; j<= i/2; j++)
    {
        char tmp;
        tmp = out[i - j];
        out[i - j] = out[j];
        out[j] = tmp;
    }
    return;
}
/*
* 输入
所给整数在long所能表达的范围之内。n是4个字节,用数组接收
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
*/
int main()
{
    int a, b;
    long  res;
    char n[11] = {0};
    char out[11] = {0};
    while (scanf_s("%d %s %d", &a, n, 10, &b) != EOF)
    {
        res = NumberToDec(a, n);
        NumberToDec(res, b, out);
        printf("%s", out);
    }
    return 0;
}