㈠ C语言 十进制数转换为罗马数字的引深
这不就是判断吗,跟输入字符转换成字符串一样的
㈡ 求将罗马数转换成十进制数的C源代码
罗马数字是欧洲在阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字,即Ⅰ(1)、X(10)、C (100)、M (1000),V (5)、L(50)、D (500)。记数的方法:(1)相同的数字连写,所表示的数等于这些数字相加得到的数,如, Ⅲ = 3;(2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如,Ⅷ = 8,Ⅻ = 12;(3)小的数字,(限于Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如,Ⅳ = 4,Ⅸ = 9;(4)在一个数的上面画一条横线,表示这个数增值 1 000 倍,如 Ⅻ = 12 000 。罗马数字的组数规则,有几条须注意掌握;(1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。(2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。(3)V 和 X 左边的小数字只能用Ⅰ。(4)L 和 C 左边的小数字只能用×。(5)D 和 M 左 边的小数字只能用 C 。用罗马数字记较大的数非常麻烦, 所以已不常用了。在中文出版物中,罗马数字主要用于某些代码,如产品型号等。计算机 ASCⅡ码收录有合体的罗马数字 1~12 。
罗马数字起源于古罗马。一共有7个数字符号:IVXLCDM.相应的阿拉伯数字表示为:1510501005001000用罗马数字表示数时,如果几个相同的数字并列,就表示这个数的值是数码的几倍。倒如:罗马数字要表示3,可以写成III;要表示20,可以写成XX;要表示30,可写成XXX。不相同的几个数码并列时,如果小的数码在右边,就表示数的数值是这几个数码的和;如果小的数码在基边,就表示数的数值是数码之差。例如:6用罗马数字可以表示为VI;4用罗马数字表示为IV;11用罗马数字表示为XI;48用罗马数字表示为IIL。在数字上面画一横线,表示这个数字增值1000倍。例如:10000写成X;11000写成XI。遗憾的是,罗马数字里没有0。这种记数法有很大不便。如果表示8732这个数,那么就得写成IIXDCCXXXII如果要有0就方便多了。0引入的时间是在中世纪,那时欧洲教会的势力非常强大,他们千方百计地阻止0的传播,甚至有人为了传播0而被处死。但是黑暗终究战胜不了光明,人们一但意识到0的重要作用,就会不顾一切地冲破教会的束缚,大胆地使用起它来。
㈢ 罗马数字转换为十进制数的问题
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define SYMBOLNUM 7
int GetSymbolIndex(char symbols[],char symbol,int n)
{
while(--n>0)
if(toupper(symbol)==symbols[n])
return n;
return n;
}
int main()
{
char r[16];
char symbols[SYMBOLNUM]={'I','V','X','L','C','D','M'};
int power[SYMBOLNUM]={1,5,10,50,100,500,1000};
int n,len,i=0,*rslt,value=0;
printf("罗马数字个数:");
scanf("%d",&n);
rslt=(int*)malloc(n*sizeof(int));
while(i<n)
{
scanf("%s",r);
len=strlen(r)-1;
while(len>=0)
{
int index=GetSymbolIndex(symbols,r[len],SYMBOLNUM);
if(index<0)
{
puts("输入了非法字符!");
free(rslt);
return 0;
}
if(len>0)
{
int index_1=GetSymbolIndex(symbols,r[len-1],SYMBOLNUM);
if(index_1<0)
{
puts("输入了非法字符!");
free(rslt);
return 0;
}
else if(index==index_1+2||index==index_1+1)
{
value+=power[index]-power[index_1];
len-=2;
}
else
{
value+=power[index];
len--;
}
}
else
{
value+=power[index];
break;
}
}
rslt[i++]=value;
value=0;
}
for(i=0;i<n;i++)
printf("%d\n",rslt[i]);
free(rslt);
return 0;
}
㈣ C语言如何将一个数字组成的字符串转变成十进制数
办法很多,提供三种供参考。
一、直接使用库函数atoi将数字字符串转换成十进制整数。代码如下:
#include"stdio.h"
#include"stdlib.h"//调用库函数atoi要包含这个文件
intmain(intargc,char*argv[]){
chara[]="478167831";
printf("%d ",atoi(a));//直接调用atoi将a转换为十进制整数
return0;
}
二、用库函数sscanf直接将数组中的数字字符串读入十进制整型变量。代码如下:
#include"stdio.h"
intmain(intargc,char*argv[]){
chara[]="478167831";
intx;
sscanf(a,"%d",&x);//调用sscanf,读入时自动转换为int型并由%d控制以十进制赋给变量x
printf("%d ",x);//输出
return0;
}
三、自行编写转换代码:
#include"stdio.h"
intmain(intargc,char*argv[]){
chara[]="478167831";
intx,i;
for(x=i=0;a[i];(x*=10)+=a[i++]-'0');//字符与数字的关系是"字符值-'0'==同名数字"
printf("%d ",x);//输出
return0;
}
上述三代码的输出结果如下图:
㈤ C++将输入的罗马数据化为十进制数
可以参见网络的罗马数字规则:
基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
V 和 X 左边的小数字只能用 Ⅰ;
L 和 C 左边的小数字只能用X;
D 和 M 左边的小数字只能用 C。
这样,首先需要对数字进行规则检查,然后才能转换。
这里涉及到词法分析方面的知识。建议反过来,从罗马数字串的右边开始反向检索分析,这样可以边分析边处理同时可以及时终止报错。
代码大致如下(没有写完哈,请自行补充其他的情形):
#defineM_1000
#defineD_500
#defineC_100
#defineL_50
#defineX_10
#defineV_5
#defineI_1
charr_digits='LXXXVII';
#include<string.h>
unsignedr2d(char*p){
unsignedres=0;
intlen=strlen(p);
inti;
unsignedshortcnt_M=0;
unsignedshortcnt_D=0;
unsignedshortcnt_C=0;
unsignedshortcnt_L=0;
unsignedshortcnt_X=0;
unsignedshortcnt_V=0;
unsignedshortcnt_I=0;
charpre_char=p[len-i-1];
switch(){
case'M':res=M_;break;
case'D':res=D_;break;
case'C':res=C_;break;
case'L':res=L_;break;
case'X':res=X_;break;
case'V':res=V_;break;
case'I':res=I_;break;
};
for(i=1;i<len;i++){
switch(p[len-i-1]){
case'I':
switch(pre_char){
case'M':res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");break;
case'D':res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");break;
case'C':res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");break;
case'L':res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");break;
case'X':res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");break;
case'V':if(cnt_I==0){cnt_I++;res-=I_;}else{res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");}break;
case'I':if(cnt_I<=2){cnt_I++;res+=I_;}else{res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");}break;
default:res=NULL;printf("Error:%s %*.*s ",p,len-i-1+7,len-i-1+7,"^");break;
}
case'V':
}
}
}
㈥ C语言 罗马数字转十进制2
//刚写的code,测试通过,如果有疑问,欢迎交流
#include<stdio.h>
#defineN13
charstr_lib[][10]={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
intval_lib[]={1,4,5,9,10,40,50,90,100,400,500,900,1000};
intmain(){
intnum,cur_value,i;
while(scanf("%d",&num)!=EOF){
for(i=0;i<N;i++){
cur_value=num/val_lib[N-i-1];
while(cur_value){
printf("%s",str_lib[N-i-1]);
cur_value--;
}
num%=val_lib[N-i-1];
}
putchar(' ');
}
return0;
}
㈦ C语言,怎么把十进制数转化成罗马数字啊
#include<stdio.h>
intmain()
{
staticchar*a[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"
};/*建立对照表*/
intn,t,i,m;
printf("Pleaseenternumber:");
scanf("%d",&n);/*输入整数*/
printf("%d=",n);
for(m=0,i=1000;m<3;m++,i/=10)
{
t=(n%i)/(i/10);/*从高位向低位依次取各位的数字*/
printf("%s",a[2-m][t]);/*通过对照表翻译输出*/
}
printf(" ");
}
㈧ C语言 输入罗马数字转换成十进制的数字
#include <stdio.h>
static int map[26] = {0};
#define BUF_SIZE 81
#define N 24
int getNumber(char *s)
{
char *p = s;
int number = 0;
int value;
char c;
while(*p && (*p != '\n')){
value = map[*p];
c = *(p+1);
if((c == '\0') || (c == '\n') || (map[c] <= value)){
number += value;
}else{
number -= value;
}
p++;
}
return number;
}
int main()
{
int n;
int i;
char buf[BUF_SIZE];
int out[N];
map['I'] = 1;
map['V'] = 5;
map['X'] = 10;
map['L'] = 50;
map['C'] = 100;
map['D'] = 500;
map['M'] = 1000;
scanf("%d\n", &n);
if(n > N) return 1;
for(i = 0; i < n; i++){
fgets(buf, BUF_SIZE, stdin);
out[i] = getNumber(buf);
}
for(i = 0; i < n; i++){
printf("%d\n", out[i]);
}
return 0;
}