接下来是中间部分的内容(接上):
4.数组
4.1求序列前N项和
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后2位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
C语言实现:
#include <stdio.h>
int main(){
int i,j,Cnt,q;
float sum=0;
int cnt=0;
scanf("%d",&Cnt);
i=1,j=1;
for(;cnt<Cnt;cnt++){
sum += 1.0*i/j;
q=j;
j=i;
i=q+j;
}
printf("%.f\n",sum);
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int i,j,Cnt,q;
float sum=0;
int cnt=0;
cin>>Cnt;
i=1,j=1;
for(;cnt<Cnt;cnt++){
sum += 1.0*i/j;
q=j;
j=i;
i=q+j;
}
cout<<sum<<endl;
return 0;
}
4.2约分最简分式
分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:在scanf的格式字符串中加入“/”,让scanf来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如5/6表示6分之5。
输入样例:
60/120
输出样例:
1/2
C语言实现:
#include <stdio.h>
int main() {
int x, y, i;
scanf("%d", &x);
getchar(); // 消耗输入缓冲区中的回车符
scanf("%d", &y);
for (i = x; i > 2; i--) { // 从高到低
if (x % i == 0 && y % i == 0) {
x /= i;
y /= i;
}
}
printf("%d/%d\n", x, y);
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int x,y,i;
cin>>x;
char cc=getchar();
cin>>y;
for(i=x;i>2;i--){ //从高到低
if(x%i==0 && y%i==0){
x/=i;
y/=i;
}
}
cout<<x<<"/"<<y<<endl;
}
4.3念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如yi er san si。
输入样例:
-600
输出样例:
fu liu ling ling
C语言实现:
#include <stdio.h>
#include <string.h>
int main() {
char *str[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu", "fu"};
int m, k, d, N = 1;
scanf("%d", &m);
if (m < 0) {
printf("fu ");
m = -m;
}
int M = m;
while (M > 9) {
N *= 10; // 确定初始除数
M /= 10;
}
while (m >= 1) {
d = m / N;
m %= N; // 同时缩水十倍
N /= 10; // 同时缩水十倍
printf("%s ", str[d]);
}
return 0;
}
C++实现:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
string str[11]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","fu"};
int m,k,d,N=1;
cin>>m;
if(m<0){
cout<<"fu ";
m=-m;
}
int M=m;
while(M>9){
N*=10; //确定初始除数
M/=10;
}
while(m>=1){
d=m/N;
m%=N; //同时缩水十倍
N/=10; //同时缩水十倍
cout<<str[d]<<" ";
}
return 0;
}
4.4求a的连续和
输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S = a+aa+aaa+...+aaa...a(n个a)。如a为2、n为8时输出的是2+22+222+...+22222222的和。
输入格式:
输入在一行中给出两个整数,先后表示a和n。
输出格式:
在一行中输出要求的数列之和。
输入样例:
2 4
输出样例:
2468
C语言实现:
#include <stdio.h>
int main() {
int m, n, i, j;
int sum = 0;
scanf("%d %d", &m, &n);
int a[n];
int N = n;
int M = m;
for (i = 0; i < N; i++) {
m = M; // 保留原数值
n = N; // 保留原数值
for (; n > i; n--) {
a[i] += m;
m *= 10;
}
}
for (j = 0; j < i; j++) // 记住此时i值已经膨胀1跳出上次循环
sum += a[j];
printf("%d\n", sum);
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int m,n,i,j;
int sum=0;
cin>>m>>n;
int a[n]={0};
int N=n;
int M=m;
for(i=0;i<N;i++){
m=M; //保留原数值
n=N; //保留原数值
for(;n>i;n--){
a[i]+=m;
m*=10;
}
}
for(j=0;j<i;j++) //记住此时i值已经膨胀1跳出上次循环
sum+=a[j];
cout<<sum<<endl;
}
4.5混合类型数据格式化输入
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。
输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。
输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70
C语言实现:
#include <stdio.h>
int main() {
float f1, f2;
int a;
char c;
scanf("%f %d %c %f", &f1, &a, &c, &f2);
printf("%d %c %.2f %.2f", a, c, f1, f2);
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
float f1,f2;
int a;
char c;
cin>>f1>>a>>c>>f2;
printf("%d %c %.2f %.2f",a,c,f1,f2);
return 0;
}
4.6简单计算器
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
C语言实现:
#include <stdio.h>
int main() {
int x, total, flag = 1;
char c = '0';
scanf("%d", &x);
total = x;
while (c != '=') {
scanf(" %c", &c); // 注意空格,消耗回车或空格等字符
if (c == '=') {
break;
}
scanf("%d", &x);
if (c == '+') {
total += x;
} else if (c == '-') {
total -= x;
} else if (c == '*') {
total *= x;
} else if (c == '/') {
if (x == 0) {
flag = -1;
} else {
total /= x;
}
} else {
flag = -1;
}
}
if (flag == -1) {
printf("ERROR\n");
} else {
printf("%d\n", total);
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int x,total,flag=1;
char c='0';
cin>>x;
total = x;
while(c != '='){
cin>>c;
if(c=='=')
break; //此处的位置也至关重要
cin>>x;
if (c == '+') {
total += x;
} else if (c == '-') {
total -= x;
} else if (c == '*') {
total *= x;
} else if (c == '/') {
if (x == 0) {
flag = -1;
} else {
total /= x;
}
} else {
flag = -1;
}
} if(flag==-1) cout<<"ERROR"<<endl;
else cout<<total<<endl;
return 0;
}
5.字符/字符串
5.1字符串字母大小写转换
输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。
输入格式:
输入在一行中给出一个长度不超过40的、以#结束的非空字符串。
输出格式:
在一行中按照要求输出转换后的字符串。
输入样例:
Hello World! 123#
输出样例:
hELLO wORLD! 123
C语言实现:
#include <stdio.h>
int main() {
char c;
c = getchar();
while (c != '#') {
if (c >= 'a' && c <= 'z')
c -= 32;
else if (c >= 'A' && c <= 'Z')
c += 32;
printf("%c", c);
c = getchar();
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
char c;
c=getchar();
while(c!='#'){
if(c>='a' && c<='z')
c-=32;
else if(c>='A' && c<='Z')
c+=32;
cout<<c;
c=getchar();
}
return 0;
}
5.2单词长度
你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格;最后的‘.’不计算在内。
输入格式:
输入在一行中给出一行文本,以‘.’结束。
提示:用scanf("%c",...);来读入一个字符,直到读到‘.’为止。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:
It's great to see you here.
输出样例:
4 5 2 3 3 4
C语言实现:
#include <stdio.h>
int main() {
char a[30];
int b[100] = {0}, j = 0, cnt = 0;
for (int i = 1; a[i - 1] != '.'; i++) {
a[i] = getchar();
if (a[i] != ' ' && a[i] != '.') {
cnt++;
} else {
b[j++] = cnt;
cnt = 0;
}
}
for (int i = 0; i < j; i++) {
if (b[i] != 0) {
printf("%d ", b[i]);
}
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
char a[30];
int b[100] = {}, j = 0, cnt = 0;
for (int i = 1; a[i - 1] != '.'; i++)
{
a[i] = getchar(); //双指放在触控板实现粘贴
if(a[i] != ' ' && a[i] != '.')
cnt++;
else
{
b[j++] = cnt; //a[i++]=a[j]相当于a[i]=a[j],i++;
cnt = 0;
}
}
for (int i = 0; i < j; i++)
{
if (b[i] != 0)
cout << b[i] << " ";
}
return 0;
}
5.3写出这个数
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。
输出格式:
在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
C语言实现:
#include <stdio.h>
int main() {
int n, d, m = 0;
scanf("%d", &n);
while (n > 0) {
d = n % 10;
n /= 10;
m += d;
}
char *str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int k, N = 1;
int M = m;
while (M > 9) {
N *= 10;
M /= 10;
}
while (m >= 1) {
d = m / N;
m %= N;
N /= 10;
printf("%s ", str[d]);
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int n,d,m=0;
cin>>n;
while(n>0){
d=n%10;
n/=10;
m+=d;
}
string str[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int k,N=1;
int M=m;
while(M>9){
N*=10;
M/=10;
}
while(m>=1){
d=m/N;
m%=N;
N/=10;
cout<<str[d]<<" ";
}
return 0;
}
5.4换个格式输出整数
让我们用字母B来表示“百”、字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。
输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。
输出格式:每个测试用例的输出占一行,用规定的格式输出n。
输入样例1:
234
输出样例1:
BBSSS1234
输入样例2:
23
输出样例2:
SS123
C语言实现:
#include <stdio.h>
int main() {
int x, i = 0, j, k;
int a[3] = {0};
// 读取输入
scanf("%d", &x);
// 将输入分解为个位、十位和百位
while (x > 0) {
a[i] = x % 10;
x /= 10;
i++;
}
i--;
// 根据数字的位置输出相应的字符串
if (i == 2) {
// 输出百位的B
for (k = 1; k <= a[2]; k++) {
printf("B");
}
// 输出十位的S
for (k = 1; k <= a[1]; k++) {
printf("S");
}
// 输出个位的数字
for (j = 1; j <= a[0]; j++) {
printf("%d", j);
if (a[0] == j) {
break;
}
}
} else if (i == 1) {
// 输出十位的S
for (k = 1; k <= a[1]; k++) {
printf("S");
}
// 输出个位的数字
for (j = 1; j <= a[0]; j++) {
printf("%d", j);
if (a[0] == j) {
break;
}
}
} else {
// 仅输出个位的数字
for (j = 1; j <= a[0]; j++) {
printf("%d", j);
if (a[0] == j) {
break;
}
}
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int x,i=0,j,k;
int a[3]={0};
cin>>x;
while(x>0){
a[i]=x%10;
x/=10;
i++;
}i--;
if(i=2){
for(k=1;k<=a[2];k++)
cout<<"B";
for(k=1;k<=a[1];k++)
cout<<"S";
for(j=1;j<=9;j++){
cout<<j;
if(a[0]==j) break;
}
}
else if(i=1){
for(k=1;k<=a[1];k++)
cout<<"S";
for(j=1;j<=9;j++){
cout<<j;
if(a[0]==j) break;
}
}
else{
for(j=1;j<=9;j++){
cout<<j;
if(a[0]==j) break;
}
}
}
5.5A+B和C
给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。
输入格式:
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。
输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
C语言实现:
#include <stdio.h>
int main() {
int x, i, j;
scanf("%d", &x);
int a[x][3];
// 读取输入
for (i = 0; i < x; i++) {
for (j = 0; j < 3; j++) {
scanf("%d", &a[i][j]);
}
}
// 检查每个案例
for (i = 0; i < x; i++) {
if (a[i][0] + a[i][1] > a[i][2]) {
printf("Case #%d: true\n", i + 1);
} else {
printf("Case #%d: false\n", i + 1);
}
}
return 0;
}
C++实现:
#include<iostream>
using namespace std;
int main(){
int x,i,j;
cin>>x;
int a[x][3]={0};
for(i=0;i<x;i++){
for(j=0;j<3;j++){
cin>>a[i][j];
}
}
for(i=0;i<x;i++){
if(a[i][0]+a[i][1]>a[i][2])
cout<<"Case #X: true"<<endl;
else
cout<<"Case #X: false"<<endl;
}
return 0;
}
本次呈现数组和字符串相关内容,后面的内容在(下)中呈现!
若是小白,推荐看看翁恺老师的系列课程,各大平台都有,很好找。
习题参考了这位道友的博客内容,其他内容皆是原创,附上对应链接-->
原文链接:https://blog.csdn.net/fjinhao/article/details/4685317