洛谷P1465 序言页码 Preface Numbering

洛谷P1465 序言页码 Preface Numbering

 

 1 #include <cstdio> 
 2 #include <cmath>
 3 #define For(i,j,k) for(int i=j;i<=k;i++) 
 4 using namespace std ; 
 5 const char c[7] = { 'I','V','X','L','C','D','M' } ; 
 6 int a[7] ; 
 7 int n ; 
 8 
 9 inline int read() 
10 {
11     int x = 0 , f = 1 ; 
12     char ch = getchar() ; 
13     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar(); } 
14     while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar(); } 
15     return x * f ; 
16 }
17 
18 inline void find(int val) 
19 {
20     int x ; 
21     if(val>=1000) {
22         a[6]+=val/1000 ; 
23         val%=1000 ; 
24     }
25     if(val>=100) {
26         x = val / 100 ; 
27         if(x<=3) a[4]+=x ; 
28         if(x==4) a[4]++,a[5]++ ; 
29         if(x>=5&&x<=8) a[4]+=x-5,a[5]++ ; 
30         if(x==9) a[4]++,a[6]++ ;  
31         val%=100 ; 
32     }
33     if(val>=10) {
34         x = val / 10 ; 
35         if(x<=3) a[2]+=x ; 
36         if(x==4) a[2]++,a[3]++ ; 
37         if(x>=5&&x<=8) a[2]+=x-5,a[3]++ ; 
38         if(x==9) a[2]++,a[4]++ ;  
39         val%=10 ; 
40     }
41     x = val ; 
42     if(x<=3) a[0]+=x ; 
43     if(x==4) a[0]++,a[1]++ ; 
44     if(x>=5&&x<=8) a[0]+=x-5,a[1]++ ; 
45     if(x==9) a[0]++,a[2]++ ;  
46 }
47 
48 int main() 
49 {
50     n = read() ; 
51     For(i,1,n) find(i) ; 
52     For(i,0,6) 
53         if(a[i]) printf("%c %d\n",c[i],a[i]) ; 
54     return 0 ; 
55 }

 

 1 #include<set>
 2 #include<map>
 3 #include<list>
 4 #include<queue>
 5 #include<stack>
 6 #include<string>
 7 #include<math.h>
 8 #include<time.h>
 9 #include<vector>
10 #include<bitset>
11 #include<memory>
12 #include<utility>
13 #include<stdio.h>
14 #include<sstream>
15 #include<iostream>
16 #include<stdlib.h>
17 #include<string.h>
18 #include<algorithm>
19 #define LL unsigned long long   
20 using namespace std;
21 char c[31][5]={
22 " ","I","II","III","IV","V","VI","VII","VIII","IX","X",
23 "XX","XXX","XL","L","LX","LXX","LXXX","XC","C","CC",
24 "CCC","CD","D","DC","DCC","DCCC","CM","M","MM","MMM"};
25 int num[31]={0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,
26 80,90,100,200,300,400,500,600,700,800,900,1000,2000,3000};//每个字母对应的数字
27 int n;
28 int a[26];//26个字母,大雾,其实是存那几个字母的数量
29 void find(int nn)//nn转成罗马数字然后统计? 
30 {
31     int j=30;
32     char s[30];
33     while (num[j]>nn) j--;//找到第一个<=n的数 
34     for (;j>=1;j--)
35     {
36         if (nn>=num[j])//如果nn比这个数大或者等于这个数
37         {/*其实是不用担心40被强行分成XXX和X的,因为40在表中*/
38             nn-=num[j];//减掉 
39             for (int x=0;x<strlen(c[j]);x++)//统计各个字母的个数 
40             a[int(c[j][x])-65]++; 
41         } 
42         if (nn==0) return; //节约时间。已经搜完了 
43     }
44 } 
45 int main() 
46 {
47     freopen("preface.in","r",stdin);
48     freopen("preface.out","w",stdout); 
49     scanf("%d",&n);//读入 
50     for (int i=1;i<=n;i++) 
51     find(i);
52     //输出,因为是按照这个顺序所以我找不到什么好办法输出了 
53     if (a[int('I')-65]!=0) printf("I %d\n",a[int('I')-65]);
54     if (a[int('V')-65]!=0) printf("V %d\n",a[int('V')-65]);
55     if (a[int('X')-65]!=0) printf("X %d\n",a[int('X')-65]);
56     if (a[int('L')-65]!=0) printf("L %d\n",a[int('L')-65]);
57     if (a[int('C')-65]!=0) printf("C %d\n",a[int('C')-65]);
58     if (a[int('D')-65]!=0) printf("D %d\n",a[int('D')-65]);
59     if (a[int('M')-65]!=0) printf("M %d\n",a[int('M')-65]);
60     return 0;
61 }

 

posted @ 2017-10-02 15:57  third2333  阅读(256)  评论(0编辑  收藏  举报