1个回答
展开全部
#include "stdio.h"
#include <stdlib.h>
int RomanStringToNum(char *p){//R-->D
int s;
for(s=0;*p;p++)
s += *p=='M' ? 1000 : *p=='D' ? 500 : *p=='C' ? 100 : *p=='L' ? 50 : *p=='X' ? 10 : *p=='V' ? 5 : 1;
return s;
}
char *NumToRomanString(int n){//数字-->罗马string
int t=0,c=1000,x=2,y=5,m;
char *p;
m=n;
while(c){
for(;m>=c;t++,m-=c);
c/=x,x+=y,y=x-y,x-=y;
}
if((p=(char *)malloc(sizeof(char)*t+1))==NULL){
printf("Application memory failure, exit...\n");
return 0;
}
c=1000,x=2,y=5,m=0;
while(c){
for(;n>=c;n-=c)
p[m++] = c==1000 ? 'M' : c==500 ? 'D' : c==100 ? 'C' : c==50 ? 'L' : c==10 ? 'X' : c==5 ? 'V' : 'I';
c/=x,x+=y,y=x-y,x-=y;
}
p[m]='\0';
return p;
}
int IsRomanString(char *p){//判断是否合法
while(*p){
if(*p!='M' && *p!='D' && *p!='C' && *p!='L' && *p!='X' && *p!='V' && *p!='I')
return 0;
p++;
}
return 1;
}
void GetRomanString(char *p){//接收用户输入的罗马数字
fgets(p,100,stdin);
while(*p)
p++;
*(p-1)='\0';
}
int main(int argv,char *argc[]){
char Rom1[101],Rom2[101],*p;
int a,b;
printf("Please enter Rom1 & Rom2(non-zero,Rom1>Rom2,'Enter' separated)...\n");
GetRomanString(Rom1);
GetRomanString(Rom2);
if(IsRomanString(Rom1) && IsRomanString(Rom2) && (a=RomanStringToNum(Rom1))>(b=RomanStringToNum(Rom2))){
printf("\n%s + %s = %s\n",Rom1,Rom2,p=NumToRomanString(a+b));
free(p);
printf("%s - %s = %s\n",Rom1,Rom2,p=NumToRomanString(a-b));
free(p);
printf("%s * %s = %s\n",Rom1,Rom2,p=NumToRomanString(a*b));
free(p);
printf("%s / %s = %s\n",Rom1,Rom2,p=NumToRomanString(a/b));
free(p);
}
else
printf("Input error...\n");
return 0;
}
运行样例:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询