t1啤酒与饮料
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
思路:
- 这题比较简单,后面看别人的解法,发现可以换成整数防止出错,意思就是2.3、1.9、82.3都乘以10~
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
float p=82.3;
for(int i=1;i<=35;i++){ //全部买啤酒能买35瓶
for(int j=1;j<=43;j++){ //全部买饮料可以买43瓶
if(float(i*2.3+j*1.9)==p&&i<j)printf("%d\n",i);
}
}
return 0;
}
//得到输出为11
t2切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容
思路1:
- 可以看出,面条数 = 2对折数+ 1,所以210+1=1025
思路2:
- 每次增加都是前一项的两倍-1,(n+1)=2*n-1。
- 递归出口是n=2,return 2*f(n递减)-1即可。
#include<iostream>
#include<stdio.h>
using namespace std;
int i=0;
int f(int n){
if(n==0)return 2;
return 2*f(n-1)-1;
}
int main(){
printf("%d",f(10));
return 0;
}
t3李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
思路1(递归):
- 逢店加一倍,遇花喝一斗,共遇到店5次,遇到花十次,最后一次是花。
#include<iostream>
#include<stdio.h>
using namespace std;
int ans=0;
void f(int jiu,int hua,int dian){
if(hua==1&&jiu==1&&dian==0)ans++;//最后遇到花喝完最后的一斗酒
if(hua>0||jiu>0)f(jiu-1,hua-1,dian);//遇到花喝一斗
if(dian>0)f(jiu*2,hua,dian-1);//遇到店酒加倍
}
int main(){
f(2,10,5);
printf("%d\n",ans);
return 0;
}
记住,递归的出口是return或者运行完。
思路2(全排列):
- < algorithm>标准头文件,调用next_permutation(),最后排序后的数列是递减的。所以数组a中元素必须要递增写,否则不能罗列所有排列。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[15]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,2,2,2,2};//-1遇花,2遇店
int n = 0;//记录总数
do{
int sum = 2; //初始斗酒数
for(int i=0; i<15; i++){
if(a[i] == -1){
sum += a[i];
}else{
sum *= a[i];
}
}
if(a[14]==-1&&sum==0){ //a[14]最后一次是遇花
n +=1;
}
}while(next_permutation(a,a+15));//全排列
cout<< n << endl;
return 0;
}
思路3(暴力):
- 15层for循环
t4史丰收运算
史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!
速算的核心基础是: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;
}
题解:if(r>0) return i;
注释写得很清楚~
#include<bits/stdc++.h>
using namespace std;
//计算个位
int ge_wei(int a)
{
if(a % 2 == 0)//偶数
return (a * 2) % 10; //乘以2保留个位
else//奇数
return (a * 2 + 5) % 10;//乘以二加上5保留个位
}
//计算进位
int jin_wei(char* p)
{
char* level[] = {
"142857",
"285714",
"428571",
"571428",
"714285",
"857142"
};//多位数超过n/7,就要进n
char buf[7];
buf[6] = '\0';
strncpy(buf,p,6); //将p指向的字符串拷贝到buff中
int i;
for(i=5; i>=0; i--){
int r = strcmp(level[i], buf);//从后往前 以此取level中的串和buf比较
if(r<0) return i+1; //r<0的话,buf更大,得出了进位数=i+1
while(r==0){//buf和level[i]相同了
p += 6;//往后偏移六位
strncpy(buf,p,6);//再拷贝6个字符到buf中再比较
r = strcmp(level[i], buf);
if(r<0) return i+1;//如果buf大,那么得出进位数=i+1
if(r>0) return i; //填空
}
}
return 0;
}
//多位数乘以7
void f(char* s)
{
int head = jin_wei(s); //head是s的进位
if(head > 0) printf("%d", head); //输出进位
char* p = s; //拷贝字符串指针
while(*p){ //指针没有到末尾
int a = (*p-'0'); //字符转数字
int ge = ge_wei(a);//算出个位
int jin=jin_wei(mod+1);
int x = (ge_wei(a) + jin_wei(p+1)) % 10;//个位加上后续字符串的进位 取个位
printf("%d",x);//打印
p++; //指针后移
}
printf("\n");
}
int main()
{
f("428571428571");
f("34553834937543");
return 0;
}
t5打印图形
小明在X星球的城堡中发现了如下图形和文字:
rank=3
*
* *
* *
* * * *
rank=5
*
* *
* *
* * * *
* *
* * * *
* * * *
* * * * * * * *
* *
* * * *
* * * *
* * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
ran=6
*
* *
* *
* * * *
* *
* * * *
* * * *
* * * * * * * *
* *
* * * *
* * * *
* * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* *
* * * *
* * * *
* * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
小明开动脑筋,编写了如下的程序,实现该图形的打印。
#define N 70
void f(char a[][N], int rank, int row, int col)
{
if(rank==1){
a[row][col] = '*';
return;
}
int w = 1;
int i;
for(i=0; i<rank-1; i++) w *= 2;
____________________________________________;
f(a, rank-1, row+w/2, col);
f(a, rank-1, row+w/2, col+w);
}
int main()
{
char a[N][N];
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++) a[i][j] = ' ';
f(a,6,0,0);
for(i=0; i<N; i++){
for(j=0; j<N; j++) printf("%c",a[i][j]);
printf("\n");
}
return 0;
}
请仔细分析程序逻辑,填写缺失代码部分。
通过浏览器提交答案。注意不要填写题目中已有的代码。也不要写任何多余内容(比如说明性的文字)
思路:
- 数字每增加一次就是重复执行上一次的三次
#include<bits/stdc++.h>
#define N 70
using namespace std;
void f(char a[][N], int rank, int row, int col) //row 行、col 列
{
if(rank==1){
a[row][col] = '*';
return;
}
int w = 1;
int i;
for(i=0; i<rank-1; i++) w *= 2;
f(a,rank-1,row,col+w/2); //a,5,0,16处理顶上的三角形 //填空
f(a, rank-1, row+w/2, col);//a,5,16,0 处理左下角三角形
f(a, rank-1, row+w/2, col+w);//a,5,16,16处理右下角三角形
}
int main()
{
/* 初始化数组开始 */
char a[N][N];
int i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++) a[i][j] = ' ';
/* 初始化数组结束 */
/* 填星号开始 */
f(a,6,0,0); //布置rank=6的图形
/* 填星号结束 */
/* 输出图形开始 */
for(i=0; i<N; i++){
for(j=0; j<N; j++) printf("%c",a[i][j]);
printf("\n");
}
/* 输出图形结束 */
return 0;
}