1100. Mars Numbers (20)

本文介绍了一个程序,用于实现地球十进制计数系统与火星十三进制计数系统之间的相互转换。通过输入地球或火星上的数值,程序能准确地输出对应的另一种计数方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

People on Mars count their numbers with base 13:

  • Zero on Earth is called "tret" on Mars.
  • The numbers 1 to 12 on Earch is called "jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec" on Mars, respectively.
  • For the next higher digit, Mars people name the 12 numbers as "tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou", respectively.

For examples, the number 29 on Earth is called "hel mar" on Mars; and "elo nov" on Mars corresponds to 115 on Earth. In order to help communication between people from these two planets, you are supposed to write a program for mutual translation between Earth and Mars number systems.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (< 100). Then N lines follow, each contains a number in [0, 169), given either in the form of an Earth number, or that of Mars.

Output Specification:

For each number, print in a line the corresponding number in the other language.

Sample Input:
4
29
5
elo nov
tam
Sample Output:
hel mar
may
115
13

#include <iostream>
#include <cstring>

using namespace std;

char lower[13][5] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
char higher[13][5] = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};

int toNum(char* str){
	int res = 0;
	int i = 0;
	while(str[i] != '\0'){
		res = res * 10 + str[i] - '0';
		i++;
	}
	return res;
}

int main(){
	int count;
	char all[20];
	char fir[5], sec[5];
	scanf("%d", &count);
	getchar();
	while(count--){
		gets(all);
		strcpy(fir, "");
		strcpy(sec, "");
		sscanf(all, "%s", fir);
		if(fir[0] >= '0' && fir[0] <= '9'){
			int num = toNum(fir);
			int shi = num / 13;
			int ge = num % 13;
			if(shi > 0){
				printf("%s",higher[shi]);
			}
			if(shi > 0 && ge > 0){
				printf(" ");
			}
			if(ge > 0 || shi == 0){
				printf("%s\n", lower[ge]);
			}
			else{
				printf("\n");
			}
		}
		else{
			int res = 0;
			sscanf(&all[strlen(fir)], "%s", sec);
			for (int i = 1; i < 13; ++i){
				if(strcmp(higher[i], fir) == 0){
					res = i * 13;
					strcpy(fir, sec);
					break;
				}
			}
			for(int i = 0; i < 13; i++){
				if(strcmp(lower[i], fir) == 0){
					res += i;
					break;
				}
			}
			printf("%d\n", res);
		}
	}
	return 0;
}


在MIPS汇编语言中编写这样的程序需要遵循MARS汇编的基本语法,并利用适当的指令集来实现输入、计算和输出操作。以下是一个简单的示例,该程序使用`syscall`指令进行用户输入和输出: ```assembly .data prompt1: .asciiz "请输入整数n: " prompt2: .asciiz "请输入n个整数: " result: .asciiz "它们的总和是: " .text .globl main main: # 初始化堆栈指针 addi $sp, $sp, -4 # 准备打印提示信息 li $v0, 4 la $a0, prompt1 syscall # 从键盘读取n li $v0, 5 syscall sw $v0, n_value($sp) # 存储n值到堆栈 # 计算n值的位置 addi $t0, $sp, 4 # 循环读取并累加n个整数 read_loop: # 读取下一个整数 li $v0, 5 syscall sll $t1, $v0, 2 # 将输入扩大两倍以便保存整数(MIPS有16位寄存器) add $t1, $t1, n_value($sp) # 加上之前存储的n值 sw $v0, ($t1) # 检查是否所有整数都已读完 lw $t2, n_value($sp) sub $t2, $t2, $zero bltz $t2, end_read_loop # 如果n=0,则退出循环 # 累加操作 add $s0, $s0, $zero # 初始化sum为0 lwl $s0, sum($sp) # 从堆栈获取当前sum jal add_num # 调用自定义的加法函数 j read_loop end_read_loop: # 清理堆栈并将结果输出 addi $sp, $sp, 4 li $v0, 4 la $a0, result syscall lw $a0, sum($sp) li $v0, 1 # 输出数值 syscall # 自定义加法函数 add_num: jal check_numbers # 验证输入合法性 add $a1, $a0, $s0 # 结果入$a1 jr $ra # 返回 check_numbers: beq $a0, $zero, invalid_input # 判断输入是否为零 addi $sp, $sp, -4 sw $a0, num1($sp) jal check_validity lw $a0, num1($sp) addi $sp, $sp, 4 jr $ra invalid_input: li $v0, 4 la $a0, error_msg syscall li $v0, 10 # 停止程序 syscall error_msg: .asciiz "无效输入! 请输入一个正整数。\n" ``` 运行此程序时,首先会提示输入整数n,然后按顺序请求n个整数输入,最后将这些数字相加并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值