Red: could not solve
Orange: have better answer
画图
绘制余弦曲线
my code:
#include <iostream>
#include <cmath>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{
int a[41][72]; //use array to record the data,
for (int i = 0; i<=40; i++) //initialize to 0
{
for(int j=0; j<=71; j++)
a[i][j]=0;
}
double degree,value;
for (int i =0; i<=71; i++)
{
degree = 3.1415926*i*5/180;
value = cos(degree);
int j;
j = 40 - (value + 1)*20; //convert to array value
a[j][i]=1;
}
for (int i = 0; i<=40; i++)
{
for (int j =0; j<=71; j++)
{
if (a[i][j] ==1)
cout << "*";
else cout << " ";
}
cout << "\n";
}
}
Better solution (no need to use array):
#include <iostream>
#include <cmath>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{
double y;
int x,m;
for (y = 1; y>=-1; y-=0.1)
{
m = acos(y)*10;
for (x = 1; x<m; x++)
cout << " ";
cout << "*";
for (;x<62-m; x++) // because * appear twice for each value
cout << " ";
cout << "*\n";
}
}
画一个圆
(console屏幕长宽比例不对,需加上系数才能显示出圆形。下面的程序未加系数)
#include <iostream>
#include <cmath>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{
int r;
cout << "input radius:" << endl;
cin >> r;
int x,y,mark;
double length;
for (y = 0; y<= r; y++)
{
length = r*r-(r-y)*(r-y);
mark = sqrt(length);
for(x=0; x<r-mark; x++)
cout << " ";
cout << "*";
for (; x < r + mark; x++)
cout <<" ";
cout << "*\n";
}
for (;y <= r*2; y++)
{
length = r*r - (y-r)*(y-r);
mark = sqrt(length);
for(x=0; x<r-mark; x++)
cout << " ";
cout << "*";
for (; x < r + mark; x++)
cout <<" ";
cout << "*\n";
}
}
多次分配
分鱼
A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?
my answer:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
for(int i=6; ;i+=5)
{
int j;
if((i-1)%5==0)
{
j=(i-1)/5*4;
if((j-1)%5==0)
{
j=(j-1)/5*4;
if((j-1)%5==0)
{
j=(j-1)/5*4;
if((j-1)%5==0)
{
j=(j-1)/5*4;
if((j-1)%5==0)
{
cout << "result is" << i <<endl;
break;
}
else
continue;
}
else
continue;
}
else
continue;
}
else
continue;
}
else
continue;
}
}
Better Solution: 采用控制标记
#include<iostream>
using namespace std;
int main()
{
int n,i,x,flag=1; /*flag:控制标记*/
for(n=6;flag;n++) /*采用试探的方法。令试探值n逐步加大*/
{
for(x=n,i=1&&flag;i<=5;i++)
if((x-1)%5==0) x=4*(x-1)/5;
else flag=0; /*若不能分配则置标记falg=0退出分配过程*/
if(flag) break; /*若分配过程正常结束则找到结果退出试探的过程*/
else flag=1; /*否则继续试探下一个数*/
}
cout <<"Total number of fish catched=" << n <<endl; /*输出结果*/
}
卖金鱼
买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸中共有几条金鱼?
此题与上一题类似,关键是找出每次分配需满足的条件,以及每次分配之后的数与分配之前的数的关系。
#include<iostream>
using namespace std;
int main()
{
int n,i,x,flag=1; /*flag:控制标记*/
for(n=11;flag;n++) /*采用试探的方法。令试探值n逐步加大*/
{
for(x=n,i=2;i<=5;i++)
{
if((x+1)%i==0)
x=x-(x+1)/i;
else
{
flag=0;
break;
}
}
if(flag) break; /*若分配过程正常结束则找到结果退出试探的过程*/
else flag=1; /*否则继续试探下一个数*/
}
cout <<"Total number of fish catched=" << n <<endl; /*输出结果*/
}
求因子、倍数
求因子 factor
求因子:
int subNumber(int n){
if(n<=2)
return n;
int count=2;
int maxNum=(int)sqrt((double)n)+1;
for(int i=2;i<maxNum;i++)
if(0==n%i)
count+=2;
//去除重复计算如4*4=16;
if(n==pow((double)(maxNum-1), 2))
count--;
return count;
}
求质数 prime number
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数.
#include<iostream>
using namespace std;
int primeNumber(int n)
{
if(n<2)
cout << "error" << endl;
int i,j,cnt = 0;
for(i=2;i<=n;++i)
{
double k=i;
for(j=2;j<=sqrt(k)||j<=i;++j) //2,3是特殊情况
{
if(i%j==0)
break;
}
if(j>sqrt(k))
{
cout<<i<<endl;
++cnt;
}
}
cout << "total number is:" <<cnt <<endl;
return 0;
}
int main()
{
primeNumber(100);
}
求最大公约数 largest common divisor
#include<iostream>
using namespace std;
int commondivisor(int a, int b)
{
int tmp;
while (a%b!=0)
{
tmp=a;
a=b;
b=tmp%a;
cout << a <<" " << b << endl;
}
return b;
}
int main()
{
cout << "the greatest common divisor is:" << commondivisor(30,42) << endl;
}
求最小公倍数 Least Common Multiple
#include<iostream>
#include<cmath>
using namespace std;
int commonMultiple(int a, int b)
{
int tmp,aa,bb;
aa=a;
bb=b;
while(aa%bb!=0)
{
tmp=aa;
aa=bb;
bb=tmp%aa;
}
return a*b/bb;
}
int main()
{
cout << commonMultiple(commonMultiple(commonMultiple(7,8),9),10) << endl;
}
当需要求多个数的最大公约数,最小公倍数时,先求其中两个,然后再求第三个,第四个。。。
数字拆分/操作
奇异三位数
一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。
#include<iostream>
using namespace std;
int main()
{
int i,j,k;
for (i=1;i<=6;++i)
for (j=0;j<=6;++j)
for (k=0;k<=6;++k) //应当在循环内直接输出结果,否则容易使值增加(用flag)
{
if(i*49+j*7+k==i+j*9+k*81)
cout << "number is:" << i*100+j*10+k<< endl;
}
}
平方数
已知两个平方三位数abc和xyz,其中a、b、c、x、y、z未必是不同的;而ax、by、cz是三个平方二位数。请编程求三位数abc和xyz。
#include<iostream>
using namespace std;
int issquare(int a)
{
int b[]={0,16, 25, 36, 49, 64, 81}; //0也是平方数?
int index = 0;
while(index <=6)
{
if(a==b[index])
return 1;
++index;
}
return 0;
}
int main()
{
int i,j,v1,v2;
int a,b,c,x,y,z;
for(i=10;i<=31;++i)
{
for(j=10;j<=31;++j)
{
v1=i*i;
v2=j*j;
a=v1/100;
b=v1%100/10;
c=v1%10;
x=v2/100;
y=v2%100/10;
z=v2%10;
int k=issquare(a*10+x);
if(issquare(a*10+x)&&issquare(b*10+y)&&issquare(c*10+z))
cout <<v1 <<"and" <<v2<<endl;
}
}
}
若issquare包括零,则有两组解:400&900以及841&196,否则只有一组解
自守数
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:
25*25=625 76*76=5776 9376*9376=87909376
请求出200000以内的自守数
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main()
{
long i,sum,dig,V10,V0;
for(i=0;i<=200000;++i)
{
sum=0;
dig=V0=1; //V10 is the (total digits+1)
V10=10; //V0 is the current digit used to multiple
long Ovalue=i;
while(Ovalue/10!=0)
{
Ovalue/=10;
++dig;
V10*=10;
}
Ovalue=i;
for(int j=dig;j>0;--j)
{
sum+=i*(Ovalue%10)*V0;
Ovalue/=10;
V0*=10;
sum=sum%V10;
}
if(sum==i)
cout <<i <<endl;
}
}
分析: 若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计算机无法表示过大的整数。
分析手工方式下整数平方(乘法)的计算过程,以376为例:
376 被乘数
X 376 乘数
———-
2256 第一个部分积=被乘数*乘数的倒数第一位
2632 第二个部分积=被乘数*乘数的倒数第二位
1128 第三个部分积=被乘数*乘数的倒数第三位
———-
141376 积
本问题所关心的是积的最后三位。分析产生积的后三位的过程,可以看出,在每一次的部分积中,并不是它的每一位都会对积的后三位产生影响。总结规律可以得到:在三位数乘法中,对积的后三位产生影响的部分积分别为:
第一个部分积中:被乘数最后三位*乘数的倒数第一位
第二个部分积中:被乘数最后二位*乘数的倒数第二位
第三个部分积中:被乘数最后一位*乘数的倒数第三位
将以上的部分积的后三位求和后截取后三位就是三位数乘积的后三位。这样的规律可以推广到同样问题的不同位数乘积
A better solution: 逻辑简单,但程序冗长
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main()
{
int i,count=0;
int IK=1000, IH=100, IW=10000, ISW=100000, IM=1000000; //cannot use macro?
for(i=1;i<10;++i)
{
if(i==i*i%10)
{
count++;
cout << i << endl;
}
}
for(i=10;i<100;++i)
{
if(i==i*i%100)
{
count++;
cout << i << endl;
}
}
for(i=100;i<1000;++i)
{
if(i==i*i%1000)
{
count++;
cout << i << endl;
}
}
for(i=1000;i<10000;++i)
{
if(i==i*i%10000)
{
count++;
cout << i << endl;
}
}
for(i=10000;i<100000;++i) //可以继续做下去,求更大的数字
{
int sum;
sum=i*(i%10)+
(i%IW)*(i%IH/10)*10+
(i%IK)*(i%IK/IH)*IH+
(i%IH)*(i%IW/IK)*IK+
(i%10)*(i/IW);
if(sum%ISW==i)
{
count++;
cout << i << endl;
}
}
cout <<"number is:" << count << endl;
}
A better solution (把所有的数都当做六位数,高位可以为零!)
#include<iostream>
#include<cmath>
#include<vector>
#include<string>
using namespace std;
int main()
{
int i,sum,count=0,V;
for(i=25;i<=200000;++i) //suppose all i has 6 digits
{
sum=i*(i%10)+
i%100000*(i/10%10)*10+
i%10000*(i/100%10)*100+
i%1000*(i/1000%10)*1000+
i%100*(i/10000%10)*10000+
i%10*(i/100000%10)*100000;
V=10;
int j=i;
while((j=j/10)!=0)
V*=10;
if(sum%V==i)
{
cout << i << endl;
++count;
}
}
cout << "number is:" << count <<endl;
}
Others
求13 的13次方最后三位数
#include <iostream>
#include <cmath>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{
int value=13;
for (int i=0; i!=12; ++i)
{
value = value*13%1000;
}
cout << value << endl;
}
一百阶乘的尾数有多少个零
分析:为了解决这个问题,必须首先从数学上分析在100!结果值的末尾产生零的条件。不难看出:一个整数若含有一个因子5,则必然会在求100!时产生一个零。因此问题转化为求1到100这100个整数中包含了多少个因子5。若整数N能被25整除,则N包含2个因子5;若整数N能被5整除,则N包含1个因子5。Solution:
#include <iostream>
#include <cmath>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{
int a,count=0;
for(a = 5; a <=100; a+=5)
{
++count;
if(!(a%25))
++count;
}
cout << count <<endl;
}
分析2: 由分析1得,此题相当于求因子5的个数,因此可以用
递归算法:
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
using std::endl;
int cal(int remain)
{
if(remain <5)
return 0;
else
return (remain/5 + cal(remain/5));
}
int main()
{
int value;
cout << "input the value:" << endl;
cin >> value;
cout << cal(value) << endl;
}
杨辉三角
easy way(直角三角形):
#include <iostream>
#include <cmath>
#include <iomanip> //set the output format
using namespace std;
int main()
{
int value;
cout << "input the number of lines:" << endl;
cin >> value;
int a[100][100];
for(int i = 1; i<= value; ++i)
{
a[i][1]=1;
a[i][i]=1;
if(i > 2)
{
for(int j=2; j < i; ++j)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
for(int i = 1; i <=value; ++i)
{
for(int j = 1; j<=i; ++j)
cout << setw(4) << a[i][j]; //set the width
cout << "\n";
}
}
二进制输出整数
#include <iostream>
using namespace std;
int main()
{
bitset<sizeof(int)*8> a;
cout << "input the int value:" <<endl;
int b;
cin >> b;
a = b;
cout << a;
}
存钱
假设银行整存整取存款不同期限的月息利率分别为:
0.63% 期限=1年
0.66% 期限=2年
0.69% 期限=3年
0.75% 期限=5年
0.84% 期限=8年
利息=本金*月息利率*12*存款年限。
现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。
2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8
其中rateN为对应存款年限的利率。根据题意还可得到以下限制条件:
0<=i8<=2
0<=i5<=(20-8*i8)/5
0<=i3<=(20-8*i8-5*i5)/3
0<=i2<=(20-8*i8-5*i5-3*i3)/2
0<=i1=20-8*i8-5*i5-3*i3-2*i2
可以用穷举法穷举所有的i8、i5、i3、i2和i1的组合,代入求本利的公式计算出最大值,就是最佳存款方案。
#include<iostream>
using namespace std;
#include<cmath>
int main()
{
int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
float max=0,term;
for(i8=0;i8<3;i8++) /*穷举所有可能的存款方式*/
for(i5=0;i5<=(20-8*i8)/5;i5++)
for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++)
{
i1=20-8*i8-5*i5-3*i3-2*i2;
term=2000.0*pow((double)(1+0.0063*12),(double)i1)
*pow((double)(1+2*0.0063*12),(double)i2)
*pow((double)(1+3*0.0069*12),(double)i3)
*pow((double)(1+5*0.0075*12),(double)i5)
*pow((double)(1+8*0.0084*12),(double)i8);
/*计算到期时的本利合计*/
if(term>max)
{
max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;
}
}
cout << " Toal:" << max << endl;
/*输出存款方式*/
}
平分七框鱼
甲、乙、丙三位鱼夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有七筐装满了鱼,还有七筐装了半筐鱼,另外七筐则是空的,由于他们没有秤,只好通过目测认为七个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为三份?
分析: 可将条件看成一个3*3数组,要求每行相加结果为7,每列相加为7. 而且a[i][0]*2+a[i][1]=7. 同时发现,第一列的每个数都必须大于等于1,小于等于3. 在此情况下,只要求出第一列的三个数,那么其他的数可以依次求出,所以只需要对第一列的数进行loop求解:
#include<iostream>
using namespace std;
int main()
{
int i,j,k, count = 0;
for(i=1; i<=3;++i) //i is a[0][0]
{
for(j=1; j<=7-i && j<=3;++j) //j is a[1][0]
{
k=7-i-j; //k is a[2][0]
if(k<=0 || k>3)
continue;
if(i<j || i<k || j<k) //此行用于排除同一个解的不同排列组合
continue;
++count;
cout << i<<" "<<j<<" "<<k <<endl;
}
}
cout << count <<endl;
}
素数幻方
求四阶的素数幻方。即在一个4X4 的矩阵中,每一个格填 入一个数字,使每一行、每一列和两条对角线上的4 个数字所组成的四位数,均为可逆素数。
可逆素数: 本身与其相反数都是素数,不需要对称!
分析:
最简单的算法是:采用穷举法,设定4X4矩阵中每一个元素的值后,判断每一行、每一列和两条对角线上的4个数字组成的四位数是否都是可逆素数,若是则求出了满足题意的一个解。
这种算法在原理是对的,也一定可以求出满足题意的全部解。但是,按照这一思路编出的程序效率很低,在微机上几个小时也不会运行结束。这一算法致命的缺陷是:要穷举和判断的情况过多。
充分利用题目中的“每一个四位数都是可逆素数”这一条件,可以放弃对矩阵中每个元素进行的穷举的算法,先求出全部的四位可逆素数(204个),以矩阵的行为单位,在四位可逆素数的范围内进行穷举,然后将穷举的四位整数分解为数字后,再进行列和对角线方向的条件判断,改进的算法与最初的算法相比,大大地减少了穷举的次数。
考虑矩阵的第一行和最后一行数字,它们分别是列方向四位数的第一个数字和最后一个数字,由于这些四位数也必须是可逆素数,所以矩阵的每一行和最后一行中的各个数字都不能为偶数或5。这样穷举矩阵的第一行和最后一行时,它们的取值范围是:所有位的数字均不是偶数或5的四位可逆数。由于符合这一条件的四位可逆素数很少,所以这一范围限制又一次减少了穷举的次数。
对算法的进一步研究会发现:当设定了第一和第二行的值后,就已经可以判断出当前的这种组合是否一定是错误的(尚不能肯定该组合一定是正确的)。若按列方向上的四个两位数与四位可逆数的前两位矛盾(不是其中的一种组合),则第一、二行的取值一定是错误的。同理在设定了前三行数据后,可以立刻判断出当前的这种组合是否一定是错误的,若判断出矛盾情况,则可以立刻设置新的一组数据。这样就可以避免将四个数据全部设定好以后再进行判断所造成的低效。
根据以上分析,可以用伪语言描述以上改进的算法:
开始
找出全部四位的可逆素数;
确定全部出现在第一和最后一行的四位可逆素数;
在指定范围内穷举第一行
在指定范围内穷举第二行
若第一、第二、三行已出现矛盾,则继续穷举下一个数;
在指定范围内穷举第四行
判断列和对角方向是否符合题意
若符合题意,则输出矩阵;
否则继续穷举下一个数;
结束
在实际编程中,采用了很多程序设计技巧,假如设置若干辅助数组,其目的就是要最大限度的提高程序的执行效率,缩短运行时间。下面的程序运行效率是比较高的。
//此程序只求出第一组解(可以求所有解)
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
vector<int> prime;
for(int i=1000;i<10000;++i)
{
double k=i;
double max=sqrt(k);
int j;
for(j=2;j<=max;++j)
{
if(i%j==0)
break;
}
if(j>max)
{
int ii=i%10*1000+i/10%10*100+i/100%10*10+i/1000;
double kk=ii;
int jj;
double mm=sqrt(kk);
for(jj=2;jj<=mm;++jj)
if(ii%jj==0)
break;
if(jj>mm)
{
prime.push_back(i);
//cout << i <<endl;
}
}
}
//cout << prime.size()<<endl;
vector<int>::iterator iter1,iter2,iter3,iter4,itera,iterb,iterc,iterd,itere,iterf;
vector<int> prime1; //prime1为第一,第四个数可能的取值
for(iter1=prime.begin();iter1!=prime.end();++iter1)
{
int t1, t2;
t1=*iter1/100%10;
t2=*iter1/10%10;
if(t1%2!=0 && t1%5!=0)
prime1.push_back(*iter1);
}
vector<int> prime2, prime3; //prime2,prime3用于限定前两位,前三位
for(iter1=prime.begin();iter1!=prime.end();++iter1)
{
prime2.push_back(*iter1/100);
}
for(iter1=prime.begin();iter1!=prime.end();++iter1)
{
prime3.push_back(*iter1/10);
}
int aa,bb,cc,dd,ee,ff;
for(iter1=prime1.begin();iter1!=prime1.end();++iter1)
{
for(iter2=prime.begin();iter2!=prime.end();++iter2)
{
if(find(prime2.begin(), prime2.end(), *iter1/1000*10+*iter2/1000)==prime2.end()||
find(prime2.begin(), prime2.end(), *iter1/100%10*10+*iter2/100%10)==prime2.end() ||
find(prime2.begin(), prime2.end(), *iter1/10%10*10+*iter2/10%10)==prime2.end() ||
find(prime2.begin(), prime2.end(), *iter1%10*10+*iter2%10)==prime2.end())
continue;
for(iter3=prime.begin();iter3!=prime.end();++iter3)
{
if(find(prime3.begin(), prime3.end(), *iter1/1000*100+*iter2/1000*10+*iter3/1000)==prime3.end() ||
find(prime3.begin(), prime3.end(), *iter1/100%10*100+*iter2/100%10*10+*iter3/100%10)==prime3.end() ||
find(prime3.begin(), prime3.end(), *iter1/10%10*100+*iter2/10%10*10+*iter3/10%10)==prime3.end() ||
find(prime3.begin(), prime3.end(), *iter1%10*100+*iter2%10*10+*iter3%10)==prime3.end())
continue;
for(iter4=prime1.begin();iter4!=prime1.end();++iter4)
{
aa=*iter1/1000*1000+*iter2/1000*100+*iter3/1000*10+*iter4/1000;
itera=find(prime.begin(),prime.end(),aa);
bb=*iter1/100%10*1000+*iter2/100%10*100+*iter3/100%10*10+*iter4/100%10;
iterb=find(prime.begin(),prime.end(),bb);
cc=*iter1/10%10*1000+*iter2/10%10*100+*iter3/10%10*10+*iter4/10%10;
iterc=find(prime.begin(),prime.end(),cc);
dd=*iter1%10*1000+*iter2%10*100+*iter3%10*10+*iter4%10;
iterd=find(prime.begin(),prime.end(),dd);
ee=*iter1/1000*1000+*iter2/100%10*100+*iter3/10%10*10+*iter4%10;
itere=find(prime.begin(),prime.end(),ee);
ff=*iter4/1000*1000+*iter3/100%10*100+*iter2/10%10*10+*iter1%10;
iterf=find(prime.begin(),prime.end(),ff);
if(itera==prime.end()||iterb==prime.end()||iterc==prime.end()||
iterd==prime.end()||itere==prime.end()||iterf==prime.end())
continue;
else
{
cout << *iter1 <<endl;
cout << *iter2 <<endl;
cout << *iter3 <<endl;
cout << *iter4 <<endl;
goto stop;
}
}
}
}
}
stop:
cout <<"here it is"<< endl;
}
循环输出
只允许使用一个循环先输出1至10内的奇数
然后输出其中的偶数
结果应该是这样的
1
3
5
7
9
2
4
6
8
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int mid=(n+1)/2;
for(int i=1;i<=n;++i)
{
if(i<=mid)
cout << i*2-1<<endl;
else
cout << (i-mid)*2<<endl;
}
}
兔子跳楼梯
一座楼有10层,超级兔子每次可以跳跃的层数可以为1,2或者3,那么它到达10层有多少种跳法并列出各种情况。
我们用f(n)来表示跳到第n层有多少种方法。
那么,因为在n层楼,只能由n-1,n-2和n-3层楼跳跃而来,所以我们可以得到
f(n)=f(n-3) + f(n-2) + f(n-1) n>=4
而我们也可以得到f(1)=1,f(2)=2,f(3)=4这些递归的终止条件,这样,我们就可以得到一个完整的递归算法:
#include <stdio.h>
// 递归函数
int jump(int n)
{
// 终止条件
if(1 == n)
{
return 1;
}
else if(2 == n)
{
return 2;
}
else if(3 == n)
{
return 4;
}
else if( n >= 4)
{
// 向下递归
return jump(n-1)+jump(n-2)+jump(n-3);
}
else //不符合条件的输入
{
return 0;
}
}
int main()
{
int floor = 10; // 10层楼
int step = jump(floor); // 获得跳跃方法数
printf("jump %d steps\n",step);
return 0;
}
实现减一运算
只用赋值、加1、循环三个操作实现一个减1的运算。
for (i; (i + 1) != a; i++)
{
}
return i;