本题目供学习复习使用
2.1 进制转换 (杭电2031)
Problem Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16,
R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考
16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
#include <stdio.h>
int TentoR(int a[], int n, int r); //进制转换函数
void output(int a[], int len, int sign); //输出函数
int main()
{
int a[32], n, r, len, sign;
while(scanf("%d%d", &n, &r)!=EOF)
{
//0特殊处理
if (n==0)
{
printf("0\n");
continue;
}
//处理负数
sign = 1;
if (n<0)
{
sign = -1;
n = -n;
}
//进制转换
len = TentoR(a, n, r);
//输出
output(a, len, sign);
}
return 0;
}
十进制—>r进制
int TentoR(int a[], int n, int r)
{
int i=0;
while(n) //循环执行条件n>0
{
a[i++] = n % r; //除r取余数
n = n / r;
}
return i; //返回数组长度
}
OJ 人见人爱
Problem Description
HDOJ上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B
能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱。
这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分
秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
Input
输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6
个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。题目保证所有的数据合法。
Output
对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的
规则(即:分和秒的取值范围在0~59),每个输出占一行,并且所有的部分都可以用32位
整数表示。
Sample Input
2
1 2 3 4 5 6
34 45 56 12 23 34
Sample Output
5 7 9
47 9 30
#include <stdio.h>
int main()
{
int ah, am, as, bh, bm, bs, t, sum;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d%d%d", &ah, &am, &as, &bh, &bm, &bs);
//计算秒
sum = as + bs;
as = sum % 60;
am = am + sum / 60;
//计算分
sum = am + bm;
am = sum % 60;
ah = ah + sum / 60;
//计算小时
ah = ah + bh;
printf("%d %d %d\n", ah, am, as);
}
return 0;
}
进制转换(二)
将十进制的正实数转换成对应的二进制数。
输入:输入十进制实数f(0<f<100000000),输入0时结束。
输出:输出f对应的二进制数,小数点后保留6位。
输入样例:
123.25
123456.789
0
输出样例:
1111011.010000
11110001001000000.110010
#include <stdio.h>
#include <math.h>
#define ND 6
int ten_2_int(int n, int a[]);//十进制整数转换成二进制
int ten_2_dec(float f, int a[],int nd); //十进制小数转换成二进制
int main()
{
int n, i, a[32];
float f;
scanf("%f",&f);
while(fabs(f)>=1e-6) //输入0时结束
{
//如果输入的是负数,先输出-号,并把f转换为整数
if (f<0)
{
f = -f;
printf("-");
}
if((int)f==0) //整数部分为0
printf("0");
else
{
n = ten_2_int((int)f, a); //转换整数部分为二进制
n--;
while (n>=0)
{
printf("%d",a[n]);
n--;
}
}
printf("."); //输出小数点
for(i=0; i<32; i++) //初始化数组,准备小数转换
a[i] = 0;
ten_2_dec(f-(int)f, a, ND); //转换小数部分, 小数点后保留ND位
i = 0;
while (i<ND) { //输出小数部分
printf("%d",a[i]);
i++;
}
printf("\n");
scanf("%f",&f); //输入下一个数
}
return 0;
}
其中小数部分转二进制
int ten_2_dec(float f, int a[], int nd)
{
int i;
i = 0;
while (i<nd && f!=0)
{
f = f * 2; //乘2
a[i] = (int) f; //取整
f = f - a[i]; //取整之后剩余的数
i++;
}
return i-1;
}
sky数
转载:https://blog.csdn.net/liangzhaoyang1/article/details/51378967?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158410607019195162510755%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158410607019195162510755&biz_id=0&utm_source=distribute.pc_search_result.none-task
确定进制
#include <stdio.h>
int dto10(int n, int d); //d进制转换成十进制
int maxNum (int num); //返回n中的最大数字
int main()
{
int d, p, q, r, max;
scanf("%d%d%d", &p, &q, &r);
while (p!=0 || q!=0 || r!=0)
{
//找出p,q,r中的最大数字
d = maxNum(p);
max = maxNum(q);
d = d > max ? d : max;
max = maxNum(r);
d = d > max ? d : max;
//寻找开始try的进制,为最大数字+1
d++;
while (d<=16) //最多测试到16进制
{
//将d进制数转换为十进制进行运算,判断等式是否成立
if (dto10(p, d) * dto10(q, d) == dto10(r, d))
break;
d++;
}
if (d>16) //没找到适合的进制
printf("0\n");
else
printf("%d\n", d);
scanf("%d%d%d", &p, &q, &r);
}
return 0;
}
其中d进制转化成十进制
int dto10(int n, int d)
{
int s, i, a[32];
//先将n的各位数字分开,存入数组
i = -1;
while (n)
{
a[++i] = n % 10;
n = n / 10;
}
//转换成10进制数
s = 0;
while (i>=0) {
s = s * d + a[i];
i--;
}
return s;
}