UVa 619 - Numerically Speaking

題目:已知十進制和二十六進制的串,將他們相互轉化,輸出數字每三位一個分隔。

分析:數學,進制轉換。兩個方向的轉化是相同的,除了基數。

說明:注意輸出格式和數據長度。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

char string[101];
char answer[101];
int  number[101];

int main()
{
	while (~scanf("%s",string)) {
		if (strcmp(string, "*")) {
			int base_from, base_to, length = strlen(string);
			if (string[0] >= '0' && string[0] <= '9') {
				base_from = 10;
				base_to = 26;
				for (int i = 0; i < length; ++ i) {
					number[i] = string[length-1-i]-'0';
				}
			}else {
				base_from = 26;
				base_to = 10;
				for (int i = 0; i < length; ++ i) {
					number[i] = string[length-1-i]-'a'+1;
				}
			}
			int loop = length*2;
			for (int i = 0; i < loop; ++ i) {
				int left = 0;
				for (int j = length; j >= 0; -- j) {
					left = left*base_from + number[j];
					number[j] = left/base_to;
					left = left%base_to;
				}
				answer[i] = left;
				for (int j = 0; j < loop; ++ j) {
					if (number[j] >= base_from) {
						number[j+1] = number[j+1] + number[j]/base_from;
						number[j] = number[j]%base_from;
					}
				}
			}
			int save = loop-1;
			while (!answer[save]) {
				save --;
			}
			if (base_to == 10) {
				printf("%-22s",string);
			}
			for (int i = save; i >= 0; -- i) {
				if (base_to == 26) {
					printf("%c",answer[i]+'a'-1);
				}else {
					printf("%c",answer[i]+'0');
					if (i > 0 && i%3 == 0) {
						printf(",");
					}
				}
			}
			if (base_to == 26) {
				for (int j = save; j < 21; ++ j) {
					printf(" ");
				}
				for (int j = 0; j < length; ++ j) {
					printf("%c",string[j]);
					if (length-1 > j && (length-j)%3 == 1) {
						printf(",");
					}
				}
			}
			puts("");
		}
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值