一道C语言难题,求助大神

问题如图所示... 问题如图所示 展开
 我来答
White_MouseYBZ
2017-09-25 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6649万
展开全部
#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;
}

运行样例:

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式