1 啤酒和饮料
题目:
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
题解:
本题可以用Excel逐个递推出答案,依次枚举啤酒的数量,减去啤酒花的钱之后剩余的钱除以饮料的价钱第一次能够除尽时,当前啤酒数量即为需要的答案。表格操作如下:
2 切面条
题目:
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
题解:
已知对折0次,得到2根面条;对折1次,得到3根面条;对折2次,得到5根面条,可推知对折n次,得到2^n+1 根面条,由表格可计算出对折10次,得到2^10+1=1025根面条。
3 李白打酒
题目:
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb
就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
题解:
已知初始状态酒数量为2,遇到店酒数量乘2,遇到花酒数量-1,共遇到店5次,遇到花10次,求李白遇到店和花次序的可能方案个数。计算方案数这类问题使用深搜方法,已知最后一次遇到花,则前面遇到花9次,店5次,则店和花数量为0,酒数量为1即得到一种方案。代码如下:
#include<iostream>
using namespace std;
int ans;
void dfs(int shop, int flower, int wine)
{
if (!shop && !flower && wine == 1) ans ++;
if (shop) dfs(shop - 1, flower, wine * 2);
if (flower) dfs(shop, flower - 1, wine - 1);
}
int main()
{
dfs(5, 9, 2);
cout << ans << endl;
return 0;
}
4 史丰收速算
题目:
史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!
速算的核心基础是:1位数乘以多位数的乘法。
其中,乘以7是最复杂的,就以它为例。
因为,1/7 是个循环小数:0.142857…,如果多位数超过 142857…,就要进1
同理,2/7, 3/7, … 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n
下面的程序模拟了史丰收速算法中乘以7的运算过程。
乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。
乘以 7 的进位规律是: 满 142857… 进1, 满 285714… 进2, 满 428571… 进3, 满 571428… 进4, 满 714285… 进5, 满 857142… 进6
请分析程序流程,填写划线部分缺少的代码。
//计算个位
int ge_wei(int a)
{
if(a % 2 == 0)
return (a * 2) % 10;
else
return (a * 2 + 5) % 10;
}
//计算进位
int jin_wei(char* p)
{
char* level[] = {
"142857",
"285714",
"428571",
"571428",
"714285",
"857142"
};
char buf[7];
buf[6] = '\0';
strncpy(buf,p,6);
int i;
for(i=5; i>=0; i--){
int r = strcmp(level[i], buf);
if(r<0) return i+1;
while(r==0){
p += 6;
strncpy(buf,p,6);
r = strcmp(level[i], buf);
if(r<0) return i+1;
______________________________; //填空
}
}
return 0;
}
//多位数乘以7
void f(char* s)
{
int head = jin_wei(s);
if(head > 0) printf("%d", head);
char* p = s;
while(*p){
int a = (*p-'0');
int x = (ge_wei(a) + jin_wei(p+1)) % 10;
printf("%d",x);
p++;
}
printf("\n");
}
int main()
{
f("428571428571");
f("34553834937543");
return 0;
}
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)
题解:
多位数乘以7,使用不同的进位制,从高位算起,每一位分别由其个位数和进位的数决定,个位数遵循偶数乘2,奇数乘2再加5的规律,进位则需借用字符串的拷贝,从高位到低位拷贝6位数字与每一个进制比较,若大于该进制,则得到进位;若等于该进制,则继续比较后面六位数字;若小于该进制,则说明不足以进位,需要进小一点的位。读完源程序发现没有用于处理小于进制时的代码,则需要在填空处添加。代码及注释如下:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
//计算个位
int ge_wei(int a)
{
if(a % 2 == 0)
return (a * 2) % 10;//偶数乘2
else
return (a * 2 + 5) % 10;//奇数乘2加5
}
//计算进位
int jin_wei(char* p)
{
char* level[] = {
"142857",
"285714",
"428571",
"571428",
"714285",
"857142"
};//存储每个进制
char buf[7];
buf[6] = '\0';
strncpy(buf,p,6);//拷贝从p前6位字符串到buf中
int i;
for(i=