机试准备第六天
第一题是world for U,又全是英文,看不懂啊。。看答案过了
#include <stdio.h>
#include <string.h>
using namespace std;
int main(){
char str[1000];
char pattern[30][30] = {0};
while(scanf("%s", str)!=EOF){
int N = strlen(str);
int n1, n2, n3;
for(n2 = 3;n2 <= N; n2++){
if((N + 2 - n2) % 2 == 0){
n1 = (N + 2 - n2)/2;
if(n1 <= n2){
n3 = n1;
break;
}
}
}//得出n1 n2 n3的模拟值
for(int i = 0; i < 29; i++){
for(int j = 0; j < 29; j++)
pattern[i][j] = ' ';
}
int x = 0;
int y = 0;
for(int i = 0; i < N;i++){
if(i < n1 - 1){
pattern[x][y] = str[i];
++x;
}
else if(i < n1+n2-2){
pattern[x][y] = str[i];
++y;
}
else {
pattern[x][y]=str[i];
--x;
}
}
for(int i = 0; i < n1; i++){
printf("%s\n", pattern[i]);
}
}
}
第二题是旋转矩阵,数量关系好难找啊。发现思路不对,可以定义一个旋转函数,依次转90度,看哪个可以对上,而且我的思路不对,应该把原矩阵的空格信息去掉。调了半天把代码调出来了。
#include <stdio.h>
#include <string.h>
using namespace std;
int main(){
int n;
scanf("%d", &n);
int arr1[10][10];
int arr2[10][10];
for(int i = 0; i < n;i++){//读入第一个矩阵,大小为n*(2*n-1)
for(int j = 0; j < n;j++){
scanf("%d", &arr1[i][j]);
}
}
for(int i = 0; i < n;i++){//读入第二个矩阵,大小为n*(2*n - 1)
for(int j = 0; j < n;j++){
scanf("%d", &arr2[i][j]);
}
}
//判断是否为0,二维矩阵对应位置全部相等
bool issame = true;
for(int i = 0; i < n;i++){
for(int j = 0; j < n;j++){
if(arr1[i][j] != arr2[i][j]) issame = false;
}
}
if(issame == true){
printf("0");
return 0;
}
//判断是否为90,二维矩阵
bool is90 = true;
for(int i =0; i < n;i++){
for(int j = 0; j < n;j++){
if(arr1[i][j] != arr2[j][n-1-i])
is90 = false;
}
}
if(is90 == true){
printf("90");
return 0;}
bool is180 = true;
for(int i =0; i < n;i++){
for(int j = 0; j < n;j++){
if(arr1[i][j] != arr2[n-1-i][ n-1-j])
is180 = false;
}
}
if(is180 == true){
printf("180");
return 0;}
bool is270 = true;
for(int i =0; i < n;i++){
for(int j = 0; j < n;j++){
if(arr1[i][j] != arr2[n-1-j][i])
is270 = false;
}
}
if(is270 == true){
printf("270");
return 0;
}
printf("-1");
}
答案思路是很清晰的。
#include <stdio.h>
using namespace std;
bool compare(int arr1[10][10], int arr2[10][10], int n){//对比函数
for(int i = 0; i <n;i++){
for (int j =0;j < n;j++){
if(arr1[i][j] != arr2[i][j]) return false;
}
}
return true;
}
void revolve(int arr[10][10], int n){
int result[10][10];
for(int i = 0; i<n;i++){
for(int j = 0; j < n;j++){
result[i][j] = arr[n-1-j][i];
}
}
for(int i = 0; i<n;i++){
for(int j = 0; j < n;j++){
arr[i][j] = result[i][j];
}
}
}
int main(){
int n;
scanf("%d", &n);
int arr1[10][10];
int arr2[10][10];
for(int i = 0; i < n;i++){//读入原始矩阵
for(int j = 0; j < n; j++){
scanf("%d", &arr1[i][j]);
}
}
for(int i = 0; i < n;i++){//读入第二个矩阵
for(int j = 0;j<n;j++){
scanf("%d", &arr2[i][j]);
}
}
if(compare(arr1, arr2, n)){
printf("0");
return 0;
}
revolve(arr1, n);
if(compare(arr1, arr2, n)){
printf("90");
return 0;
}
revolve(arr1, n);
if(compare(arr1, arr2, n)){
printf("180");
return 0;
}
revolve(arr1, n);
if(compare(arr1, arr2, n)){
printf("270");
return 0;
}
printf("-1");
}
进入日期问题。先来一道判断下一天的开胃小菜。
#include <stdio.h>
#include <string.h>
using namespace std;
void Nextday(int year, int month, int day){
int dayofMonth[] = {0, 31, 28, 31,30,31,30,31,30,31,30,31,30};
bool isLeap;//判断是否为闰月
if(year%400==0||(year%4==0&&year%100!=0)) isLeap = true;
else isLeap = false;
if(isLeap){
dayofMonth[2] = 29;
}
else {
dayofMonth[2] = 28;
}
day++;
if(day>dayofMonth[month]){
month++;
day = 1;
}
if(month>12){
month = 1;
day = 1;
year++;
}
printf("Nextday year = %d, month = %d, day = %d\n", year, month,day);
}
int main(){
int year = 2020;
int month = 2;
int day = 28;
Nextday(year, month, day);
return 0;
}
第四题是今年的第几天,简单拿下。
#include <stdio.h>
using namespace std;
int daynum(int year, int month, int day) {
int dayofmonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
dayofmonth[2] = 29;
}
int num = 0;
if (month == 1) num = day;
else {
for (int i = 1; i < month; i++) {
num += dayofmonth[i];
}
num += day;
}
return num;
}
int main() {
int year, month, day;
while (scanf("%d%d%d", &year, &month, &day) != EOF) {
int result = daynum(year, month, day);
printf("%d\n", result);
}
return 0;
}
第五题是打印日期,就是上一题反着写,写的有点丑陋。
#include <functional>
#include <stdio.h>
using namespace std;
void find(int year, int daynum){
int dayofmonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year%400==0||(year%4==0&&year%100!=0)) dayofmonth[2]=29;
int month;
int day;
int num;
if(daynum<=31){
month = 1;
day = daynum;
}
else if (daynum == 365||daynum == 366) {
month =12;
day = 31;
}
else{
for(int i = 1;i<=12;i++){
daynum -= dayofmonth[i];
if(daynum==0){
month = i;
day = dayofmonth[i];
break;
}
else if(daynum<0){
month = i;
day = daynum + dayofmonth[i];
break;
}
}
}
if(month>=10&&day>=10){
printf("%d-%d-%d\n", year,month,day);
}
if(month<10&&day>=10){
printf("%d-0%d-%d\n", year,month,day);
}
if(month>=10&&day<10){
printf("%d-%d-0%d\n", year,month,day);
}
if(month<10&&day<10){
printf("%d-0%d-0%d\n", year,month,day);
}
}
int main(){
int year;
int daynum;
while(scanf("%d%d", &year,&daynum)!=EOF){
find( year, daynum);
}
}
第六题是日期累加,我的方法不太好,答案是一天一天加,加n天。
#include <stdio.h>
using namespace std;
void daynum(int year, int month, int day, int num) {
int dayofmouth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) dayofmouth[2] = 29;
day = day + num;
while (day > dayofmouth[month]) {
day -= dayofmouth[month];
month++;
if (month > 12) {
year++;
month = 1;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) dayofmouth[2] = 29;
else dayofmouth[2] = 28;
}
}
printf("%04d-%02d-%02d\n", year, month, day);
}
int main() {
int n;
scanf("%d", &n);
int year, month, day, num;
for (int i = 0; i < n; i++) {
scanf("%d%d%d%d", &year, &month, &day, &num);
daynum(year, month, day, num);
}
}
第七题是日期差值,还是一个日期一个日期加。
#include <stdio.h>
using namespace std;
void nextday(int& year, int& month, int& day) { //日期加一
int dayofmonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
dayofmonth[2] = 29;
}
day++;
if (day > dayofmonth[month]) {
day = 1;
month++;
}
if (month > 12) {
year++;
month = 1;
}
}
int main() {
int a, b;
while (scanf("%d%d", &a, &b) != EOF) {
int year, month, day;
int year1, month1, day1;
int year2, month2, day2;
year1 = a / 10000;
month1 = (a % 10000) / 100;
day1 = a % 100;
year2 = b / 10000;
month2 = (b % 10000) / 100;
day2 = b % 100;
int n = 0;
if (a < b) {
year = year1;
month = month1;
day = day1;
while (1) {
nextday(year, month, day);
n++;
if (year == year2 && month == month2 && day == day2) {
printf("%d\n", n+1);
break;
}
}
} else if (a > b) {
year = year2;
month = month2;
day = day2;
while (1) {
nextday(year, month, day);
n++;
if (year == year1 && month == month1 && day == day1) {
printf("%d\n", n+1);
break;
}
}
}
else {printf("0");}
}
}