基本编程题
题目来源(PAT题目)
7-34 通讯录的录入与显示
题目
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。
本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。
输入格式:
输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话和手机均为不超过15位的连续数字,前面有可能出现+。
在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。
输出格式:
对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found。
题解
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
struct Information {
string name;
string birthday;
string sex;
string regularIphone;
string iphone;
};
int main() {
int N,K,number;
scanf("%d", &N);
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空缓冲区,防止里面有残余
Information record[10];
for (int i = 0; i < N; i++) { // 输入N 条记录
string input;
getline(cin, input);
// 使用字符串流分割输入
istringstream iss(input);
string token;
int count = 0;
while (getline(iss, token, ' ')) { // 利用空格进行分割一行数据,然后利用count应该赋值给那个变量
if (count == 0) {
record[i].name = token;
}
else if (count == 1) {
record[i].birthday = token;
}
else if (count == 2) {
record[i].sex = token;
}
else if (count == 3) {
record[i].regularIphone = token;
}
else if (count == 4) {
record[i].iphone = token;
}
count++;
}
}
scanf("%d",&K);
for (int i = 0; i < K; i++) { // 循环遍历K次,对后面输入的编号进行查询
scanf("%d",&number);
if (0 <= number && number < N) {
if (i == 0) {
cout << record[number].name + " " << record[number].regularIphone + " " << record[number].iphone + " " << record[number].sex + " " << record[number].birthday;
}
else {
cout << endl << record[number].name + " " << record[number].regularIphone + " " << record[number].iphone + " " << record[number].sex + " " << record[number].birthday;
}
}
else { // 这样控制的话,不会在最后产生换行
if (i == 0) {
printf("Not Found");
}
else {
printf("\nNot Found");
}
}
}
return 0;
}
7-36 复数四则运算
题目
本题要求编写程序,计算2个复数的和、差、积、商。
输入格式:
输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。
输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
分析
通过输出样式可以发现,有好多地方都重复,那我们可以使用循环来实现操作,把运算符保存到一个数组里面,然后把实部和虚部的计算结果分别保存在两个数组里面。如果两个实部或者虚部,它们的绝对值小于0.05的话,就可以说明该部分为0,就可以不用输出。
题解
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main() {
double a1, b1, a2, b2, a[4], b[4];
char c[4] = { '+','-','*','/' };
scanf("%lf %lf %lf %lf", &a1, &b1, &a2, &b2);
a[0] = a1 + a2; b[0] = b1 + b2;
a[1] = a1 - a2; b[1] = b1 - b2;
a[2] = a1 * a2 - b1 * b2; b[2] = b1 * a2 + b2 * a1;
a[3]= (a1 * a2 + b1 * b2) / (pow(a2, 2) + pow(b2, 2));
b[3]= (b1 * a2 - a1 * b2) / (pow(a2, 2) + pow(b2, 2));
for (int i = 0; i < 4; i++) {
if (fabs(a[i]) > 0.05 && fabs(b[i]) > 0.05) {
printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf%+.1lfi", a1, b1,c[i], a2, b2, a[i], b[i]);
}
else if (fabs(b[i]) > 0.05) {
printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lfi", a1, b1, c[i], a2, b2, b[i]);
}
else if (fabs(a[i]) > 0.05) {
printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf", a1, b1,c[i], a2, b2, a[i]);
}
else {
printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf", a1, b1, c[i],a2, b2, 0);
}
if(i!=3)
printf("\n");
}
return 0;
}
补充
关于题解中的%+.1lf
- %lf是double类型数据输出格式。
- .1 代表的是小数点后面只保留一位小数。
- +:表示如果数值是正数,+号会显式地输出;如果数值是负数,+号不会输出,而是直接输出数值本身。
7-38 数列求和-加强版
题目
给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
题解
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<math.h>
int main() {
long double sum = 0, item = 0;
int A, N;
scanf("%d %d",&A,&N);
for (int i = 0; i < N; i++) {
item+= A * pow(10, i);
sum += item;
}
printf("%.Lf", sum); // long double类型是%Lf 而double类型是%lf
return 0;
}
7-28 猴子选大王
题目
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
题解
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int i, N, arr[1000] = {0}, count=0; // count 用于计数用
scanf("%d", &N);
// 把猴子编号存入数组
for (i = 0; i < N; i++)
arr[i] = i+1;
i = 0;
while (1) {
if (arr[(i + N) % N] != 0) { // 如果该位置不为0的话,count计数++
count++;
}
if (count % 3 == 0) // 淘汰报到3的猴子,把该位置于0
arr[(i + N) % N] = 0;
if (count == 3 * N-2) { // 当 count 等于 3*N-2时,刚好数组里面就剩了一个元素,此时剩余1个就是猴王,此时就可以结束循环
printf("%d", arr[(i + N) % N]);
break;
}
i++;
}
return 0;
}