目录
1. 求幂之和
计算sum=21+22+23+⋯+2n。可以调用pow函数求幂。
输入格式:
输入在一行中给出正整数n(≤10)。
输出格式:
按照格式“result = 计算结果”输出。
输入样例:
5
输出样例:
result = 62
答案:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int a=0,b;
cin>>b;
for(int i=1;i<=b;i++){
a+=pow(2,i);
}
cout<<"result = "<<a;
}
2. 韩信点兵
在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
- 按从1至5报数,记下最末一个士兵报的数为1;
- 再按从1至6报数,记下最末一个士兵报的数为5;
- 再按从1至7报数,记下最末一个士兵报的数为4;
- 最后按从1至11报数,最末一个士兵报的数为10;
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
答案:
#include<iostream>
using namespace std;
int main(){
int a;
for(a=1;;a++){
if((a%5==1)&&(a%6==5)&&(a%7==4)&&(a%11==10)){
cout<<a;
return 0;
}
}
}
3. 有理数比较
比较两个有理数的大小。
输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。
输入样例1:
1/2 3/4
输出样例1:
1/2 < 3/4
输入样例2:
6/8 3/4
输出样例2:
6/8 = 3/4
答案:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int a,b,c,d;
scanf("%d/%d %d/%d",&a,&b,&c,&d);
if(a*d-b*c>0)printf("%d/%d > %d/%d",a,b,c,d);
if(a*d-b*c<0)printf("%d/%d < %d/%d",a,b,c,d);
if(a*d-b*c==0)printf("%d/%d = %d/%d",a,b,c,d);
return 0;
}
4. 西安距离
小明来到了古都西安,想去参观大唐西市!西安的道路可以看做是与x轴或y轴垂直的直线,小明位于(a,b),而目的地位于(c,d),问最少几步可以到达。
输入格式:
一行中四个整数,a,b,c,d,表示坐标为(a,b)与(c,d),这里0<=a,b,c,d<=1000
输出格式:
输出这两个点的西安距离。
输入样例:
0 0 3 4
输出样例:
7
答案:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int a,b,c,d,x,y;
cin>>a>>b>>c>>d;
x=fabs(c-a);
y=fabs(d-b);
cout<<x+y;
}
5. 求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
答案:
#include<iostream>
using namespace std;
int main(){
int a,b=0,c;cin>>a;
for(int i=a;i<=a+3;i++){
for(int j=a;j<=a+3;j++){
for (int k=a;k<=a+3;k++){
if(i!=j&&i!=k&&j!=k){
b++;
cout<<i*100+j*10+k;
if(b==6){
b=0;
cout<<"\n";
}else{
cout<<" ";
}
}
}
}
}
return 0;
}
6. 求特殊方程的正整数解
对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X2+Y2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution
答案:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int a,b=0;cin>>a;
for(int i=1;i<a;i++){
for(int j=i;j<a;j++){
if(i*i+j*j==a){
b=1;
cout<<i<<" "<<j<<endl;
}
}
}
if(b==0)cout<<"No Solution";
}
7. 掉入陷阱的数字
对任意一个自然数N0,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1;然后对N1重复这种操作,可以产生新自然数N2;……多次重复这种操作,运算结果最终会得到一个固定不变的数Nk,就像掉入一个数字“陷阱”。对输入的自然数,给出其掉入“陷阱”的过程。
输入格式:
在一行内给出一个自然数N0(N0<30000)。
输出格式:
对于输入的N0,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:Ni (i≥1)。当某一步得到的自然数结果Nk(k≥1)与上一步Nk−1相同时,停止输出。
输入样例:
5
输出样例:
1:16
2:22
3:13
4:13
答案:
#include<iostream>
#include<cstdio>
using namespace std;
int add(int a);
int main(){
int a,b=0,c=0,d;cin>>a;
while(a!=b){
c++;
b=add(a)*3+1;
cout<<c<<":"<<b<<endl;
if(a==b){
break;
}
a=add(b)*3+1;
c++;
cout<<c<<":"<<a<<endl;
}
return 0;
}
int add(int a){
int sum=0;
int xin=0;
while(a>0){
xin=a%10;
a=a/10;
sum+=xin;
}
return sum;
}
8. 计算阶乘和
对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。
输入格式:
输入在一行中给出一个不超过10的正整数N。
输出格式:
在一行中输出S的值。
输入样例:
3
输出样例:
9
答案:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int a,b=1,c=0;cin>>a;
for(int i=1;i<=a;i++){
b=b*i;
c+=b;
}
cout<<c;
}
9. 统计MOOC证书
输入N个学生的MOOC成绩,统计优秀、合格证书的数量,以及没有获得证书的数量。学生修读程序设计MOOC,85
分及以上获得优秀证书,不到85
分但是60
分及以上获得合格证书,不到60
分则没有证书。
输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。
输出格式:
在一行中依次输出优秀证书、合格证书、没有获得证书的数量,中间以空格分隔。请注意,最后一个数字后没有空格。
输入样例1:
7
85 59 86 60 84 61 45
输出样例1:
2 3 2
输入样例2:
4
91 100 88 75
输出样例2:
3 1 0
答案:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int a,b=0,c=0,d=0,xin[1000];cin>>a;
for(int i=0;i<a;i++){
cin>>xin[i];
if(xin[i]>=85){
b++;
}
if((xin[i]<85)&&(xin[i]>=60)){
c++;
}
if(xin[i]<60){
d++;
}
}
cout<<b<<" "<<c<<" "<<d;
}
10. 查验身份证
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z
;最后按照以下关系对应Z
值与校验码M
的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
答案:
#include<iostream>
#include<cstdio>
using namespace std;
int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int b[11]={1,0,10,9,8,7,6,5,4,3,2};
string s;
bool xin();
int main(){
int n,m=0;cin>>n;
for(int i=0;i<n;i++){
cin>>s;
if(!xin()){
cout<<s<<endl;
m=1;
}
}
if(m==0)cout<<"All passed";
}
bool xin(){
int sum=0;
for(int i=0;i<17;i++){
if(s[i]<'0'||s[i]>'9')return false;
sum+=(s[i]-'0')*a[i];
}
int temp=(s[17]=='X')?10:(s[17]-'0');
return b[sum%11]==temp;
}
11. 计算职工工资
给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。
输入格式:
输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。
输出格式:
按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。
输入样例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
输出样例:
zhao 565.00
qian 430.00
zhou 630.00
答案:
#include<iostream>
#include<cstdio>
#include<iomanip>
#define N 1000
using namespace std;
struct XIN{
char name[16];
double a;
double b;
double c;
double d;
} xin[N];
int main(){
int n;cin>>n;
for(int i=0;i<n;i++){
cin>>xin[i].name>>xin[i].a>>xin[i].b>>xin[i].c;
xin[i].d=xin[i].a+xin[i].b-xin[i].c;
}
for(int i=0;i<n-1;i++){
cout<<xin[i].name<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<xin[i].d<<endl;
}
cout<<xin[n-1].name<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<xin[n-1].d;
return 0;
}
12. 找出总分最高的学生
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
答案:
#include<iostream>
#include<cstdio>
#define N 100
using namespace std;
struct XIN{
char h[10];
char name[16];
double a;
double b;
double c;
double d;
}xin[N];
int main(){
int n,m=0,l=0;cin>>n;
for(int i=0;i<n;i++){
cin>>xin[i].h>>xin[i].name>>xin[i].a>>xin[i].b>>xin[i].c;
xin[i].d=xin[i].a+xin[i].b+xin[i].c;
if(xin[i].d>m){
m=xin[i].d;
l=i;
}
}
cout<<xin[l].name<<" "<<xin[l].h<<" "<<xin[l].d;
return 0;
}
13. 矩阵运算
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例:
35
答案:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[11][11];
int i,j,n,sum=0;
cin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>a[i][j];
if(i==n-1||j==n-1||i+j==n-1)sum=sum+0;
else sum=sum+a[i][j];
}
}
cout<<sum<<endl;
return 0;
}
14. 找鞍点
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1
输出样例2:
NONE
答案:
#include<iostream>
using namespace std;
int main()
{
int n, m=0, p=0, flag=0, a[6][6], temp;
cin >> n;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cin >> a[i][j];
}
}
for(int i=0; i<n; i++)
{
temp = a[i][0];
for(int j=1; j<n; j++)
{
if(temp <= a[i][j])
{
temp = a[i][j];
}
}
for(int j=0; j<n; j++)
{
if(a[i][j] == temp)
{
m = i;
p = j;
for(int k=0; k<n; k++)
{
if(k == i)
{
continue;
}
if(a[k][j] < a[i][j])
{
flag = 1;
break;
}
}
if(flag == 0)
{
cout << m << " " << p << endl;
return 0;
}
}
flag = 0;
}
}
cout << "NONE" << endl;
return 0;
}
15. 计算平均成绩
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。
输出格式:
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。
输入样例:
5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60
输出样例:
80.00
zhang 00001
chen 21987
答案:
#include<iostream>
#include<iomanip>
#include<cstdio>
#define N 100
using namespace std;
struct XIN{
char h[10];
char name[16];
double a;
double b;
}xin[N];
int main(){
int n,x[1000],y=0,z;double m;cin>>n;
for(int i=0;i<n;i++){
cin>>xin[i].h>>xin[i].name>>xin[i].a;
m+=xin[i].a;
}
m=m/n;
printf("%.2f\n",m);
for(int i=0;i<n;i++){
if(xin[i].a<m){
cout<<xin[i].name<<" "<<xin[i].h<<endl;
}
}
return 0;
}