联发科编程大赛_第三题最大序列和

这个题目看着简单,实际花的功夫却挺大的。找不到大佬的链接了,但是确实值得学习。
/*
进制数转换

给你4个正整数。第一个是2进制,第二个为8进制,第三个为10进制,第四个为16进制。
请依次给出:
2进制数的8进制、10进制、16进制形式。
8进制数的2进制、10进制、16进制形式。
10进制数的2进制、8进制、16进制形式。
16进制数的2进制、8进制、10进制形式。

解题思想,以10进制作为中介
*/

// 初级版本,仅适用于十六进制1位的情况
#include <iostream>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <math.h>
using namespace std;

char* To_Binary(int iVal, int index, char *ch[12])
{
	int i, Cnt_unique = 0, T;
	int flag = 0;

	for (i = 16; i >= 0; --i) // 八进制转二进制
	{
		T = iVal & (1 << i);
		if (T >= 1)
		{
			ch[index][Cnt_unique] = '1';
			flag = 1;
		}

		if (T == 0 && flag == 1)
			ch[index][Cnt_unique] = '0';
		if (flag == 1)
			++Cnt_unique;
	}
	ch[index][Cnt_unique] = 0;
	return ch[index];
}


int main()
{
	FILE *fpSrc, *fpDes;
	fpSrc = fopen("execute.txt", "r");   // 打开[没有则创建]文件读取数据
	fpDes = fopen("destfile.stdin", "w");  // 打开文件写入数据
	if (fpSrc == NULL || fpDes == NULL)
	{
		printf("文件打开错误!");
		exit(-1); // 非正常退出
	}

	char Tmp, *ch[12], a[12];
	int arrInt[10];

	int i, len = 0, iTmp = 0, index = 0;
	int BaseArr[4] = { 2, 8, 10, 16 };
	while (fscanf(fpSrc, "%s", a) == 1 && index < 3) // 将2/8/10进制 转为10进制数
	{
		ch[index] = (char *)malloc(sizeof(char));
		len = strlen(a);
		memcpy(ch[index], a, len);
		ch[index][len] = 0;

		for (i = 0; i < len; i++) // 1.二进制转十进制
			iTmp += (ch[index][i] - 48) * pow(BaseArr[index], len - 1 - i);
		arrInt[index] = iTmp;
		++index;
		iTmp = 0;
	}

	// 4.十六进制数 转为10进制数
	fscanf(fpSrc, "%s", a);
	ch[index] = (char *)malloc(sizeof(char));
	len = strlen(a);
	memcpy(ch[index], a, len);
	ch[index][len] = 0;

	arrInt[index] = 0;
	for (i = 0; i < len; i++) // 2.八进制转十进制
	{
		if (ch[index][i] >= '0' && ch[index][i] <= '9')
			iTmp = ch[index][i] - 48;
		else if (ch[index][i] >= 'A' && ch[index][i] <= 'F')
			iTmp = ch[index][i] - 65 + 10;
		else if (ch[index][i] >= 'a' && ch[index][i] <= 'F')
			iTmp = ch[index][i] - 97 + 10;

		arrInt[index] += iTmp* pow(16, len - 1 - i);
	}

	fclose(fpSrc);

	// 第一个
	index = 0;
	sprintf(ch[index++], "%o", arrInt[0]);//0
	sprintf(ch[index++], "%d", arrInt[0]);//0
	sprintf(ch[index++], "%x", arrInt[0]);//2

	// 第二个
	ch[index] = To_Binary(arrInt[1], index, ch);

	ch[++index] = (char *)malloc(sizeof(char));
	sprintf(ch[index], "%d", arrInt[1]);//0

	ch[++index] = (char *)malloc(sizeof(char));
	sprintf(ch[index], "%x", arrInt[1]);//0

	// 第3个:10进制数
	++index;
	ch[index] = (char *)malloc(sizeof(char));
	ch[index] = To_Binary(arrInt[2], index, ch);

	ch[++index] = (char *)malloc(sizeof(char));
	sprintf(ch[index], "%o", arrInt[2]);//0

	ch[++index] = (char *)malloc(sizeof(char));
	sprintf(ch[index], "%x", arrInt[2]);//0

	// 第4个:16进制数
	++index;
	ch[index] = (char *)malloc(sizeof(char));
	ch[index] = To_Binary(arrInt[3], index, ch);

	ch[++index] = (char *)malloc(sizeof(char));
	sprintf(ch[index], "%o", arrInt[3]);//0

	ch[++index] = (char *)malloc(sizeof(char));
	sprintf(ch[index], "%d", arrInt[3]);//0

	for (i = 0; i < 12; i++)
	{
		if (i % 3 == 2)
			cout << ch[i] << endl;
		else
			cout << ch[i] << " ";
	}

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值