目录
选择题答案
1-5:A D D C C
6-10:B D D D A
11-15: C A A C B
16-10: C C D C C
2-9
题目:
若有下面的语句:
vector<int> v;
for (int i = 0; i < 4; i++)
v.push_back(i + 1);
cout << v.size() << endl;
则执行后程序的输出结果是:A.1 B.2 C.3 D.4
解析:
v.size()即v的大小,通过for循环依次向v中存入了1,2,3,4,因而v的大小为4.
7-1
题目:
本题要求编写程序,输出整数152的个位数字、十位数字和百位数字的值。
输入格式:
本题无输入。
输出格式:
按照以下格式输出:
152 = 个位数字 + 十位数字*10 + 百位数字*100
代码实现:
#include <stdio.h>
int main()
{
int x = 152;
int a,b,c;//a为个位数字,b为十位数字,c为百位数字
a = x%10;
b = x/10%10;
c = x/100;
printf("152 = %d + %d*10 + %d*100",a,b,c);
return 0;
}
注意:严格按照所要求的格式输出。
7-2
题目:
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
代码实现:
#include <stdio.h>
// 判断闰年
int isLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算某年某月某日是该年中的第几天
int dayOfYear(int year, int month, int day)
{
int daysOfMonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year)) daysOfMonth[2] = 29;
int i, days = 0;
for (i = 1; i < month; i++)
{
days += daysOfMonth[i];
}
days += day;
return days;
}
int main()
{
int year, month, day;
scanf("%d/%d/%d", &year, &month, &day);
printf("%d\n", dayOfYear(year, month, day));
return 0;
}
核心思想:用一维数组存储每个月的天数,再根据该年是否是闰年来判断是否修改daysOfMonth[2]的值。
7-3
题目:
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
代码实现:
#include <stdio.h>
int main()
{
int x, i ,j, k, count;
count = 0;
scanf("%d", &x);
for (i = x / 5; i > 0; i--)
for (j = x / 2; j > 0; j--)
for (k = x; k > 0; k--)
if (i * 5 + j * 2 + k == x)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", i, j, k, i+j+k);
count++;
}
printf("count = %d\n", count);
return 0;
}
注意:根据输出样例,决定5分、2分、1分硬币的个数从大到小遍历。
7-4
题目:
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
2π=1+31!+3×52!+3×5×73!+⋯+3×5×⋯×(2×i+1)i!+⋯
输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
代码实现:
#include<stdio.h>
int main()
{
double i=1;
double eps,sum=0,re=1;
scanf("%le", &eps);
while(re>=eps)
{
sum = sum + re;
re = re * i/(2*i+1);
i = i + 1;
}
sum = sum + re;
printf("PI = %.5f",2*sum);
return 0;
}
注意:题目要求直到最后一项小于给定精度eps,所以当re<eps时,跳出循环,我们仍需要把此时的re加到sum上,才满足题目要求。
7-5
题目:
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
解法一:
在原数组中进行操作即原地工作:
解法二:
由于本题对内存限制要求不高,所以可以另外动态开辟b数组存储a数组逆序之后的结果。
算法描述:
一、动态开辟a,b数组。
二、每次输入元素a[i],根据倒序关系存入b数组中即b[n-i-1]=a[i]。
三、将数组b正序输出,注意结尾无空格的格式问题(将最后一个数单独输出)。
四、将动态开辟的a,b数组释放掉。
代码实现:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int *a=(int*)malloc(n*sizeof(int));
int *b=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[n-i-1]=a[i];
}
for(int i=0;i<n-1;i++)
printf("%d ",b[i]);
printf("%d",b[n-1]);
free(a);
free(b);
return 0;
}
7-6
题目:
螺旋方阵
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
算法描述:
经过观察及思考发现,可以将一圈的遍历划分为四个方向的遍历,我们可以进行n/2趟循环即进行n/2圈遍历。当n为偶数时,进行n/2趟循环即可构造成完整的螺旋矩阵。当n为奇数时,螺旋矩阵最中间的值并未对其进行赋值,我们需要进行a[n/2][n/2]=n*n的操作。本题最重要的是要搞清楚一圈中上边一行、右边一竖、下边一行、左边一竖的遍历操作。
#include<stdio.h>
int main()
{
int n,count=1;
scanf("%d",&n);
int a[n][n];
for(int i=0;i<n/2;i++)
{
for(int j=i;j<n-i-1;j++)//遍历上边一行
{
a[i][j]=count;
count++;
}
for(int j=i;j<n-i-1;j++)//遍历右边一竖
{
a[j][n-i-1]=count;
count++;
}
for(int j=n-i-1;j>i;j--)//遍历下边一行
{
a[n-i-1][j]=count;
count++;
}
for(int j=n-i-1;j>i;j--)//遍历左边一竖
{
a[j][i]=count;
count++;
}
}
if(n%2!=0)
a[n/2][n/2]=n*n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
注意:输出格式要求每个数字占3位。
7-7
本题目要求读入n个整数(输入数字个数根据输入时随机确定,以输入一个非数字的值作为输入结束标志),利用STL比较数据大小并排序(由小到大升序),然后输出排序后的数据。
输入格式:
输入在一行中依次输入整数值,每个数字之间用空格分隔,输入数字个数根据输入时随机确定,以输入一个非数字的值作为输入结束标志。
输出格式:
先输出一段提示“从标准设备读入数据,直到输入是非整型数据为止”,在输入一组数字后,输出排序后的数字,在一行中由小到大依次输出所有值,数字之间用空格分隔。
代码实现:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v;
int num;
while(scanf("%d",&num))
{
v.push_back(num);
}
sort(v.begin(),v.end());
printf("从标准设备读入数据,直到输入是非整型数据为止\n");
for(int i=0;i<v.size();i++)
printf(" %d",v[i]);
return 0;
}
注意:1、本题主要考查C++的STL容器中sort()函数的使用。
2、严格按照所要求的格式输出。