基础编程练习题(一)

mac2026-04-09  2

非常基础的题目(后面还会更新)

7-1 I Love GPLT (5 point(s)) 这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了。

所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车

#include<iostream> #include<string> using namespace std; int main() { string str = "I Love GPLT"; for(int i = 0; i < str.length(); i ++) { cout<<str[i]<<endl; } }

7-2 跟奥巴马一起画方块 (15 point(s)) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式: 输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。

输出格式: 输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

#include<iostream> #include<string> using namespace std; int main() { int m; char a; cin>>m>>a; int size; if(m % 2== 0) { size = m /2; } else { size = m /2 + 1; } for(int i = 0; i < size; i ++) { string str(m, a); cout<<str<<endl; } }

7-3 情人节 (15 point(s))

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式: 输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。

输出格式: 根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner…”;若只有A没有B,则输出“A is the only one for you…”;若连A都没有,则输出“Momo… No one is for you …”。

#include<iostream> #include<string> #include<vector> using namespace std; int main() { vector <string> str; string st; while(1) { cin>>st; if(st==".") { break; }else{ str.push_back(st); } } if(str.size() < 2) { cout<<"Momo... No one is for you ..."; }else if(str.size() < 14) { cout<<str[1]<<" is the only one for you..."; } else{ cout<<str[1]<<" and "<<str[13]<<" are inviting you to dinner..."; } }

7-4 最佳情侣身高差 (10 point(s)) 专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。

下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

输入格式: 输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。

输出格式: 对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。

#include<iostream> #include<string> #include<vector> #include<iomanip> using namespace std; int main() { int m; vector<float>fl; cin>>m; for(int i = 0; i < m; i ++) { float h; char ch; cin>>ch>>h; if(ch == 'M') { fl.push_back(h * 100 / 109); }else{ fl.push_back(h * 109/100); } } for(int i = 0; i < fl.size(); i ++) { cout<<fixed<<setprecision(2)<<fl[i]<<endl; } }

7-5 矩阵A乘以B (15 point(s)) 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R ​a ​​ 行、C ​a ​​ 列,B有R ​b ​​ 行、C ​b ​​ 列,则只有C ​a ​​ 与R ​b ​​ 相等时,两个矩阵才能相乘。

输入格式: 输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式: 若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

#include<iostream> #include<string> #include<vector> #include<iomanip> using namespace std; int main() { int m1, n1; cin>>m1>>n1; int **p = new int *[m1]; for(int i = 0; i < m1; i ++) { p[i] = new int[n1]; } for(int i = 0; i < m1; i ++) { for(int j = 0; j < n1; j ++) { cin>>p[i][j]; } } int m2, n2; cin>>m2>>n2; int **q = new int *[m2]; for(int i = 0; i < m2; i ++) { q[i] = new int[n2]; } for(int i = 0; i < m2; i ++) { for(int j = 0; j < n2; j ++) { cin>>q[i][j]; } } // for(int i = 0; i < m2; i ++) // { // for(int j = 0; j < n2; j ++) // { // cout<<q[i][j]<<" "; // } // cout<<endl; // } if(n1 != m2) { cout<<"Error: "<<n1<<" != "<<m2; } else{ cout<<m1<<" "<<n2<<endl; for(int i = 0; i < m1; i ++) { for(int j = 0; j < n2; j ++) { int sum = 0; for(int k = 0; k < n1; k++) { sum += p[i][k] * q[k][j]; } if(j + 1 != n2) { cout<<sum<<" "; }else{ cout<<sum; } } if(i + 1 != m1) { cout<<endl; } } } }

设计函数求 N 个给定整数的均方差。若将 N 个数 A[ ] 的平均值记为 Avg,则均方差计算公式为:√ ​[(A ​1 ​​ −Avg) ​2 ​​ +(A ​2 ​​ −Avg) ​2 ​​ +⋯+(A ​N ​​ −Avg) ​2 ​​ ]/N ​ ​​ 。

输入格式: 输入首先在第一行给出一个正整数 N(≤10 ​4 ​​ ),随后一行给出 N 个正整数。所有数字都不超过 1000,同行数字以空格分隔。

输出格式: 输出这N个数的均方差,要求固定精度输出小数点后5位。

#include<iostream> #include<string> #include<vector> #include<iomanip> #include<cmath> using namespace std; int main() { int m; cin>>m; double *db = new double[m]; double sum = 0; for(int i = 0; i < m; i ++) { cin>>db[i]; sum+=db[i]; } double count = 0; for(int i = 0; i < m; i ++) { count += (db[i] * m - sum) * (db[i] * m - sum); } cout<<fixed<<setprecision(5)<<sqrt(double(double(count)/m/m/m)); }

7-7 寻找250 (10 point(s))

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。

输出格式: 在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。

#include<iostream> #include<string> #include<vector> #include<iomanip> #include<cmath> using namespace std; int main() { int position; string str; getline(cin, str); int begin=0; while(1) { position = str.find("250", begin); if(str[position - 1] ==' ') { break; } else{ begin += position; } } int count = 1; for(int i = 0; i <= position; i ++) { if(str[i] ==' ' &&str[i + 1] != ' ') { count++; } } cout<<count; }

7-8 求矩阵的局部极大值 (15 point(s)) 给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式: 输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式: 每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”

#include<iostream> #include<string> #include<vector> #include<iomanip> #include<cmath> using namespace std; int main() { int m, n; cin>>m>>n; int count = 0; int **p = new int*[m]; for(int i = 0; i < m; i ++) { p[i] = new int[n]; } for(int i = 0; i < m; i ++) { for(int j = 0; j < n; j ++) { cin>>p[i][j]; } } for(int i = 1; i < m - 1; i ++) { for(int j = 1; j < n - 1; j ++) { if(p[i][j] > p[i-1][j] &&p[i][j] > p[i+1][j] &&p[i][j] > p[i][j-1] &&p[i][j] > p[i][j+ 1]) { cout<<p[i][j]<<" "<<i + 1<<" "<<j + 1<<endl; count ++; } } } if(count == 0) { cout<<"None "<<m<<" "<<n; } }

7-9 用天平找小球 (10 point(s)) 三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式: 输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式: 在一行中输出唯一的那个不一样的球。

#include<iostream> #include<string> #include<vector> #include<iomanip> #include<cmath> using namespace std; int main() { int m, n, k; cin>>m>>n>>k; if(m - n == 0) { cout<<"C"; } if(m - k == 0) { cout<<"B"; } if(k - n == 0) { cout<<"A"; } }

7-10 字符串转换成十进制整数 (15 point(s)) 输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式: 输入在一行中给出一个以#结束的非空字符串。

输出格式: 在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

#include<stdio.h> int main() { char a; int flag=1,mark=1,sum=0; while(scanf("%c",&a),a!='#') { if(a>='0' && a<='9') { flag=0; sum=sum*16+a-'0'; } else if(a>='a' && a<='f') { flag=0; sum=sum*16+a-'a'+10; } else if(a>='A' && a<='F') { flag=0; sum=sum*16+a-'A'+10; } else if(a=='-' && flag==1) mark=0; } if(sum==0) printf("0"); else { if(mark==0) printf("-"); printf("%d\n",sum); } return 0; }
最新回复(0)