PTA

基础编程题目集

7-23 币值转换

From here

**Question:**输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

**Input Format:**输入在一行中给出一个不超过9位的非负整数。

**Output Format:**在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <string>
using namespace std;
void Transform(string m,int l);
int main()
{
string money;
while(cin>>money)
{
int l=money.length();
Transform(money,l);
}
system("pause");
return 0;
}
void Transform(string m,int l)
{
char str[10]={'a','b','c','d','e','f','g','h','i','j'};
// 0 1 2 3 4 5 6 7 8 9
//012345678
//813227345
if(l==9)
{
cout<<str[m[0]-48]<<"Y";
for(int i=1;i<l-4;i++)
{
cout<<str[m[i]-48];
if(l-i-4==4&&m[i]-48!=0) cout<<"Q";
if(l-i-4==3&&m[i]-48!=0) cout<<"B";
if(l-i-4==2&&m[i]-48!=0) cout<<"S";
}
//cout<<"W";
if(m[1]==48&&m[2]==48&&m[3]==48&&m[4]==48);
else cout<<"W";
for(int i=l-4;i<l;i++)
{
cout<<str[m[i]-48];
if(l-i==4&&m[i]-48!=0) cout<<"Q";
if(l-i==3&&m[i]-48!=0) cout<<"B";
if(l-i==2&&m[i]-48!=0) cout<<"S";
}
cout<<endl;
}
else if(l<9&&l>=5)
{
bool isZero=0;
for(int i=0;i<l-4;i++)
{
bool isEnd=1;
for(int j=i;j<l-4;j++)
{
if(m[j]!=48)
{
isEnd=0;
break;
}
}
if(isEnd) break;
if(m[i]!=48) isZero=0;
if(isZero) continue;
cout<<str[m[i]-48];
if(i>0&&m[i]-48==0)
{
isZero=1;
continue;
}
if(l-i-4==4) cout<<"Q";
if(l-i-4==3&&m[i]-48!=0) cout<<"B";
if(l-i-4==2&&m[i]-48!=0) cout<<"S";
}
cout<<"W";
isZero=0;
for(int i=l-4;i<l;i++)
{
bool isEnd=1;
for(int j=i;j<l;j++)
{
if(m[j]!=48)
{
isEnd=0;
break;
}
}
if(isEnd) break;
if(m[i]!=48) isZero=0;
if(isZero) continue;
cout<<str[m[i]-48];
if(i>0&&m[i]-48==0)
{
isZero=1;
continue;
}
//if(i>0&&m[i]-48==0)
if(l-i==4&&m[i]-48!=0) cout<<"Q";
if(l-i==3&&m[i]-48!=0) cout<<"B";
if(l-i==2&&m[i]-48!=0) cout<<"S";
}
cout<<endl;
}
else//l<5
{
if(l==1) cout<<str[m[0]-48];
bool isZero=0;
for(int i=0;i<l;i++)
{
bool isEnd=1;
for(int j=i;j<l;j++)
{
if(m[j]!=48)
{
isEnd=0;
break;
}
}
if(isEnd) break;
if(m[i]!=48) isZero=0;
if(isZero) continue;
cout<<str[m[i]-48];
if(i>0&&m[i]-48==0)
{
isZero=1;
continue;
}
if(l-i==4) cout<<"Q";
if(l-i==3&&m[i]-48!=0) cout<<"B";
if(l-i==2&&m[i]-48!=0) cout<<"S";
}
cout<<endl;
}
}

源码地址

7-24 约分最简分式

From Here

**Question:**分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

**Input Format:**输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

**提示:**在scanf的格式字符串中加入/,让scanf来处理这个斜杠。

**Output Format:**在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <stdio.h>
using namespace std;
int GCD(int s,int m);
//Greatest Common Divisor
int main()
{
int son, mom;
while (scanf("%d/%d", &son, &mom))
{
cout<<son/GCD(son,mom)<<'/'<<mom/GCD(son,mom)<<endl;
}
system("pause");
return 0;
}
int GCD(int s,int m)
{
if(s<m)
{
int temp=m;
m=s;
s=temp;
}
int r=s%m;
while(r!=0)
{
s=m;
m=r;
r=s%m;
}
return m;
}

源码地址

  • 以上代码运行时超时,但没有找到原因,答案代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int numerator,denominator,temp,a,b;
char c;
scanf("%d%c%d",&numerator,&c,&denominator);
a=numerator;
b=denominator;

while(b!=0){
temp=a%b;
a=b;
b=temp;
}
numerator/=a;
denominator/=a;
printf("%d/%d",numerator,denominator);
system("pause");
return 0;
}

源码地址