Preface Numbering

本文介绍了一个用于统计指定页数范围内罗马数字中特定字符出现次数的算法。通过解析罗马数字的构造规则,该算法实现了对I、V、X、L、C、D、M等字符的有效计数。

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

题意:给定页数N,求页码1~N(用罗马数字表示)中一共有多少个I、V、X、L、C、D、M


解题思路

  1. 读入N
  2. 从1遍历至N,在遍历过程中统计各个字母的个数
  3. 统计中参考百度百科---罗马数字----组数规则(http://baike.baidu.com/link?url=Rt-mNHT_kqOLjmxWLE7mZFAl7iH4nmdYkWRbAzSPvM48GCiw6lRiVDUhAYV_XSng

代码

/*
ID: zc.rene1
LANG: C
PROG: preface
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

enum letters{I=0, V, X, L, C, D, M};
char letter_map[7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
int result[7];

void CalculateLetters(int num)
{
    result[M] += (num/1000);
    num %= 1000;
    if (num >= 900)
    {
	result[C]++;
	result[M]++;
	num -= 900;
    }
    if (num >= 500)
    {
	result[D]++;
	num -= 500;
    }
    if (num >= 400)
    {
	result[C]++;
	result[D]++;
	num -= 400;
    }
    result[C] += (num/100);
    num %= 100;
    if (num >= 90)
    {
	result[X]++;
	result[C]++;
	num -= 90;
    }
    if (num >=50)
    {
	result[L]++;
	num -= 50;
    }
    if (num >= 40)
    {
	result[X]++;
	result[L]++;
	num -= 40;
    }
    result[X] += (num/10);
    num %= 10;
    if (num >= 9)
    {
	result[I]++;
	result[X]++;
	num -= 9;
    }
    if (num >= 5)
    {
	result[V]++;
	num -= 5;
    }
    if (num >= 4)
    {
	result[I]++;
	result[V]++;
	num -= 4;
    }
    result[I] += num;
}
    



int main(void)
{
    FILE *fin, *fout;
    int N, i;

    fin = fopen("preface.in", "r");
    fout = fopen("preface.out", "w");

    fscanf(fin, "%d", &N);
    memset(result, 0, 7*sizeof(int));

    for (i=1; i<=N; i++)
    {
	CalculateLetters(i);
    }

    for (i=I; i<=M; i++)
    {
	if (result[i] != 0)
	{
	    fprintf(fout, "%c %d\n", letter_map[i], result[i]);
	}
    }

    return 0;
}





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值