啤酒和饮料
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
代码
#include <iostream> using namespace std; int main(int argc, const char * argv[]) { for (int i = 1; i <=50 ; ++i) { for (int j = 1; j <=60 ; ++j) { if(i<j&&2.3*i+1.9*j==82.3) cout<<i<<" "<<j<<endl; } } return 0; }
切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
思路:
通过题目的已知信息,加上实验(用纸张进行实验)连续对折3次,能得9根面条。
所以是0 2;1 3;2 5;3 9;假设f[i]表示对折i次中间切一刀可以得到的面条数。
可以得到递归公式,f(i)=2*f(i-1)-1
代码
#include<stdio.h> int main() { int i,f[50]; f[0]=2; f[1]=3; for(i=1;i<=10;i++) f[i]=2*f[i-1]-1; printf("%d",f[10]); return 0; }
答案: 1025
李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
代码
递归
#include <iostream> using namespace std; int sum = 0; void f(int a, int b, int c) { if(a > 0) f(a-1, b, c*2);//不懂的,自己画画图就明白了,跟全排列差不多 if(b > 0) f(a, b-1, c-1); if(a==0 && b==0 && c==1) //c==1,由于最后一次是遇花,还未减去1,此时判断的结果刚好是李白喝完酒了 sum += 1; } int main() { f(5, 9, 2);//遇店a,遇花b,斗酒c(为何b=9?由于最后一次是遇花,不用考虑在内,否则要排除不是遇花的情况) cout << sum << endl; return 0; }
全排列
#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; }
史丰收速算
史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!
速算的核心基础是: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; }
代码分析:
#include <iostream> 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* mod) { char* level[] = { "142857", "285714", "428571", "571428", "714285", "857142" };//多位数超过 n/7,就要进n char buf[7]; buf[6] = '\0'; strncpy(buf,mod,6);//将mod这个字符串的前6个字符,拷贝到buff中 int i; for(i=5; i>=0; i--){ int tr = strcmp(level[i], buf);//从后往前,依次level中的串和buff比较 if(tr<0)//buff更大 ,得出了进位数=i+1 return i+1; while(tr==0){//buff和level[i]相同了 mod += 6;//往后偏移6位 strncpy(buf,mod,6);//再拷贝6个字符到buff中 tr = strcmp(level[i], buf);//再比较 if(tr<0) return i+1;//buf更大 // ______________________________; //填空 // //?//buff更小 if(tr>0) return i; } } return 0; } //多位数乘以7 void f(char* s)//s代表多位数 { int head = jin_wei(s);//head是s的进位 if(head > 0) printf("%d", head);//输出进位 char* mod = s;//拷贝字符串指针 while(*mod){//没有到末尾 int a = (*mod-'0');//依次字符转数字 int ge = ge_wei(a);//算出个位 int jin = jin_wei(mod + 1);//后续字符串的进位 int x = (ge + jin) % 10;//两者相加取个位 printf("%d",x);//打印 mod++;//指针后移 } printf("\n"); } int main() { f("4285711"); f("34553834937543"); return 0; }
答案:if(r>0) return i;
打印图形
小明在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 <iostream> using namespace std; #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 , 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, 5, 0, 0); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%c", a[i][j]); printf("\n"); } return 0; }
答案: f(a, rank - 1, row , col+w/2);