C语言试题第三弹

本题目供学习复习使用
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45551695/article/details/104849719