王道机试指南-习题(不定期更新,待续)
目录
第二章 暴力求解
2.1 枚举
习题2.2 百鸡问题-哈工大上机
F&Q1:在Visual Studio中,scanf被认为是不安全的,需要用scanf_s代替。
F&Q2:考虑到z/3之后,Z变为整数,必然是≤(double)z/3,这将有可能引起式子的判断失误,因为 / 是保留整数而舍去小数位的。故应该将z/3进行强制转换,但是仅仅转换z是不够的的,会因为整个式子,只有z是double型而其他数(x,y)都是整型引起错误,所以应该将三个数都强制转换。
习题2.3 Old Bill-上交大机试
F&Q1:由于最贵价格是需要最后输出的(循环结束之后),但因此万位数和个位数也只能在循环结束之后输出,因此需要加一个flag用来标记最终的符合最贵价格的万位数和个位数。
F&Q2:最贵价格可以先定义一个初值,之后每遇到一个比其大的价格,就被替换掉,最终取得最贵价格。
F&Q3:依照题目要求,火鸡的价格必须是整数,所以替换最贵价格的操作和对应的万位数、个位数的操作应该在判断伙计的价格是否是整数的条件语句大括号内
F&Q4:整个程序应当有一定的容错性,当所有的万位数和个位数组合无法除尽火鸡个数时,此时应当是无解,这也是正好是flag标记存在的意义。
#include<iostream>
#include<iostream>
using namespace std;
int main() {
int N;
int X;
int Y;
int Z;
int maxPrice = 0;
while (scanf_s("%d%d%d%d", &N, &X, &Y, &Z) != EOF) {
int i; //定义万位
int j; //定义个位
int flag1=0;
int flag2=0;
//遍历所有可能的总价格
for (i = 1; i <= 9; i++) {
for (j = 0; j <= 9; j++) {
int Remainder = (i * 10000 + X * 1000 + Y * 100 + Z * 10 + j) % N;
int result= (i * 10000 + X * 1000 + Y * 100 + Z * 10 + j) / N;
if (Remainder % N == 0) {
if (result > maxPrice) {
maxPrice = result;
flag1 = i;
flag2 = j;
}
}
}
}
if (flag1 == 0) {
printf("0");
}
else {
printf("%d %d %d\n", flag1, flag2, maxPrice);
}
}
return 0;