acm.zju.3507

这道题目意思读懂了就很容易做了,就是将数字转化成对应的罗马符号,对应转化关系表格已经全部给出来了,那么知道题目要注意的就是对于一个多位数是从高位到地位顺次转化,其实就是一道模拟题,easy,但是我wrong answer了两次,由于转化比较繁琐,所以要格外注意细节,另外就是提交格式,下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
#define Max 10010
using namespace std;
struct Str{
	int value;
	char s[20];
}str[Max];
int p[4];
int t,n;
bool cmp(const Str p,const Str q){
	return strcmp(p.s,q.s)<=0;
}	
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
	    int i,j;
	    for(i=0;i<n;i++){
		   scanf("%d",&str[i].value);
		   int k=0,temp=str[i].value;
		   while(temp){
			   p[k++]=temp%10;
			   temp/=10;
		   }
		   int index=k;
		   k=0;
		   for(j=index-1;j>=0;j--){
			//
			  switch(j){
		   case 3:
			   switch(p[j]){
		case 1: str[i].s[k++]='M'; break;
		   case 2:
			   str[i].s[k++]='M';
			   str[i].s[k++]='M';
			   break;
	       case 3: 
			   str[i].s[k++]='M';
	           str[i].s[k++]='M';
	           str[i].s[k++]='M';
			   }
			   break;
			   //
		case 2:
			
			switch(p[j]){
			case 1:
				str[i].s[k++]='C';
				break;
		    case 2:
			   str[i].s[k++]='C';
			   str[i].s[k++]='C';
			   break;
	        case 3:
		      str[i].s[k++]='C';
			  str[i].s[k++]='C';
			  str[i].s[k++]='C';
			   break;
		    case 4:
			str[i].s[k++]='C';
			str[i].s[k++]='D';
			break;
	        case 5:
		    str[i].s[k++]='D';
	    	break;
	        case 6:
	        str[i].s[k++]='D';
	        str[i].s[k++]='C';
	        break;
            case 7:
	        str[i].s[k++]='D';
	        str[i].s[k++]='C';
	        str[i].s[k++]='C';
	   break;
	    case 8:
	   str[i].s[k++]='D';
	   str[i].s[k++]='C';
	   str[i].s[k++]='C';
	   str[i].s[k++]='C';
	   break;
	    case 9:
	   str[i].s[k++]='C';
	   str[i].s[k++]='M';
	   break;
			}
			break;
case 1:
	  //
	switch(p[j]){
			case 1:
				str[i].s[k++]='X';
				break;
		   case 2:
			   str[i].s[k++]='X';
			   str[i].s[k++]='X';
			   break;
	       case 3:
		      str[i].s[k++]='X';
			  str[i].s[k++]='X';
			  str[i].s[k++]='X';
			  break;
		   case 4:
			str[i].s[k++]='X';
			str[i].s[k++]='L';
			break;
	        case 5:
		    str[i].s[k++]='L';
	    	break;
         case 6:
	   str[i].s[k++]='L';
	   str[i].s[k++]='X';
	   break;
        case 7:
	   str[i].s[k++]='L';
	   str[i].s[k++]='X';
	   str[i].s[k++]='X';
	   break;
	    case 8:
	   str[i].s[k++]='L';
	   str[i].s[k++]='X';
	   str[i].s[k++]='X';
	   str[i].s[k++]='X';
	   break;
	    case 9:
	   str[i].s[k++]='X';
	   str[i].s[k++]='C';
	   break;
			}
			break;
			//
case 0:
	switch(p[j]){
		    case 1:
				str[i].s[k++]='I';
				break;
		   case 2:
			   str[i].s[k++]='I';
			   str[i].s[k++]='I';
			   break;
	       case 3:
		      str[i].s[k++]='I';
			  str[i].s[k++]='I';
			  str[i].s[k++]='I';
			  break;
		   case 4:
			str[i].s[k++]='I';
			str[i].s[k++]='V';
			break;
	        case 5:
		    str[i].s[k++]='V';
	    	break;
         case 6:
	   str[i].s[k++]='V';
	   str[i].s[k++]='I';
	   break;
        case 7:
	   str[i].s[k++]='V';
	   str[i].s[k++]='I';
	   str[i].s[k++]='I';
	   break;
	    case 8:
	   str[i].s[k++]='V';
	   str[i].s[k++]='I';
	   str[i].s[k++]='I';
	   str[i].s[k++]='I';
	   break;
	    case 9:
	   str[i].s[k++]='I';
	   str[i].s[k++]='X';
	   break;
			}
			break;
			  }
		   }
		str[i].s[k]='\0';
	   }
	sort(str,str+n,cmp);
	printf("%d",str[0].value);
	for(i=1;i<n;i++)
		printf(" %d ",str[i].value);
	printf("\n");
	}
	return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值