1 Star 0 Fork 0

徒步天下 / EOJ

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
1147.c 4.07 KB
一键复制 编辑 原始数据 按行查看 历史
徒步天下 提交于 2018-03-08 23:43 . 新建 1147.c
/*
1147. 进制转换
Time limit per test: 2.0 seconds
Memory limit: 256 megabytes
输入一个十进制数 N,将它转换成 R 进制数输出。
Input
输入一个正整数 T。表示测试数据的组数。
每个测试实例包含两个整数 N(32 位整数) 和 R (2<=R<=36).
Output
为每个测试实例输出转换后的数,每个输出占一行。如果 R 大于 10,则对应的数字规则参考 16 进制(比如,10 用 A 表示 ,16 用 G 表示等等)。
Examples
input
3
7 2
23 12
-4 3
output
111
1B
-11
*/
#include <stdio.h>
#include <string.h>
// 定义大数结构
struct Big
{
int data[200]; //保存每一位,[0]是最低位
int len; // 数字位数
int rad; // 进制
int sign; // 符号,1,0,-1 分别表示 正数,0,负数
};
/* 由字符串生成大数
* 参数:big 指向大数的指针,用于保存转换结果,前提是先设置正确的进制 big->rad
* str 字符串
*/
int strtobig(struct Big *big, char str[])
{
int len = strlen(str), i;
char *p = str;
// 判断是否为负数
if (*p=='-')
{
big->sign = -1;
p++;
big->len = len-1;
} else
{
big->sign =1;
big->len = len;
}
// 判断是否为0
if (big->len==1 && *p=='0')
{
big->data[0]=0;
big->sign = 0;
return 0;
}
// 逐位转换
for (i=0; i<big->len; i++)
{
if (*p>='A')
big->data[big->len-1-i] = *p - 'A' + 10;
else
big->data[big->len-1-i] = *p - '0';
p++;
}
return 0;
}
/* 判断大数是否为0
* 参数:big 指向大数的指针
* 返回值:1-大数是0, 0-大数不是0
*/
int iszero(struct Big *big)
{
if (big->len==1 && big->data[0]==0)
return 1;
else
return 0;
}
/* 大数除法
* 参数:big 指向大数的指针(被除数),计算完成后,保存商
n: 除数
* 返回值:余数
*/
int bigdivn(struct Big *big, int n)
{
int mod=0;
for (int i=big->len-1; i>=0; i--)
{
mod = big->data[i] + mod * big->rad;
big->data[i] = mod / n;
mod = mod % n;
}
while (big->len >1 && big->data[big->len-1]==0)
big->len --;
return mod;
}
/* 大数转换为字符串
* 参数:big 指向大数的指针,需要转换的数
* str 字符串
*/
int bigtostr(char str[], struct Big *big)
{
char *radstr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (iszero(big))
{
str[0] = '0';
str[1] ='\0';
return 0;
}
int i=0;
if (big->sign == -1)
str[i++]='-';
for (int j=big->len-1; j>=0; j--)
{
str[i++] = radstr[big->data[j]];
}
str[i]='\0';
return 0;
}
/* 进制转换
* 参数:dec: 源数
* r: 转换后的数,要求提前设置好r->rad
*/
int dector(struct Big *r, struct Big *dec)
{
struct Big tmp;
memcpy(&tmp, dec, sizeof(struct Big));
if (iszero(dec))
{
r->sign = 0;
r->data[0] = 0;
r->len = 1;
return 0;
}
r->sign = dec->sign;
int i=0;
while (!iszero(&tmp))
{
r->data[i++]=bigdivn(&tmp, r->rad);
}
r->len = i;
return 0;
}
/* 打印大数,用于调试
* 参数:big:大数
*/
int prtbig(struct Big *big)
{
printf("big sign:%d\n", big->sign);
printf("big len:%d\n", big->len);
printf("big rad:%d\n", big->rad);
printf("big data:");
for (int i=0;i<big->len;i++)
printf("%d,", big->data[i]);
printf("\n");
return 0;
}
int main()
{
struct Big dec, r;
char str[200];
int qnum; //问题数
int rad;
scanf("%d", &qnum);
for (int i=0; i<qnum; i++)
{
scanf("%s%d", str, &rad);
dec.rad = 10;
strtobig(&dec, str);
r.rad = rad;
dector(&r, &dec);
bigtostr(str, &r);
printf("%s\n", str);
}
return 0;
}
1
https://gitee.com/se17a/EOJ.git
git@gitee.com:se17a/EOJ.git
se17a
EOJ
EOJ
master

搜索帮助