4、最佳组合问题
存款利息如下:
0.63% 期限=1年
0.66% 期限=2年
0.69% 期限=3年
0.75% 期限=5年
0.84% 期限=8年
问2000元存20年,最佳的存取方式是什么?
实际上采用的是算法中例举的穷举法,程序如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float term,max=0;
int i1,i2,i3,i5,i8,n1,n2,n3,n5,n8;
for(i8=0;i8<=2;i8++)
for(i5=0;i5<=20-8*i8;i5++)
for(i3=0;i3<=20-8*i8-i5*5;i3++)
for(i2=0;i2<=20-8*i8-5*i5-3*i3;i2++)
{
i1=20-8*i8-5*i5-3*i3-2*i2;
term=2000*pow((double)(1+8*0.0084*12),(double)i8)
*pow((double)(1+5*0.0075*12),(double)i5)
*pow((double)(1+3*0.0069*12),(double)i3)
*pow((double)(1+2*0.0066*12),(double)i2)
*pow((double)(1+0.0063*12),(double)i1);
if(term>max)
{
max=term;
n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;
}
}
cout<<"8 years:"<<n8<<endl;
cout<<"5 years:"<<n5<<endl;
cout<<"3 years:"<<n3<<endl;
cout<<"2 years:"<<n2<<endl;
cout<<"1 years:"<<n1<<endl;
return 0;
}
5、一些特殊数字求解问题
如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。
如 407=43+03+73就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。
主要涉及到如何去除数字中的每一位。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int t,k,i,a[3];
for(i=2;i<1000;i++)
{
for(t=0,k=1000;k>=10;t++)
{
a[t]=(i%k)/(k/10);
k/=10;
}
if(pow(a[0],3)+pow(a[1],3)+pow(a[2],3)==i)
cout<<i<<" ";
}
return 0;
}
设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数
#include <iostream>
using namespace std;
int main()
{
int i;
for ( i=1002;i<1111;i++)
if(i%10*1000+i/10%10*100+i/100%10*10+i/1000%10==9*i)
{
cout<<i<<endl;
break;
}
cout<<9*i;
return 0;
}
一个三位数,其7进制数刚好是其九进制数数的反序数
#include <iostream>
using namespace std;
int main()
{
int i,j,k;
for(i=1;i<7;i++)
for(j=0;j<7;j++)
for(k=1;k<7;k++)
if(i*9*9+j*9+k==k*7*7+j*7+i)
{
cout<<i*9*9+j*9+k<<endl;
cout<<i<<" "<<j<<" "<<k<<endl;
cout<<k<<" "<<j<<" "<<i;
}
return 0;
}
判断一个数是否是素数:
函数代码:
int flag(int n)
{
if(n<=1) return 0;
if(n==2) return 1;
if(!(n%2)) return 0;
for(int i=3;i<(int)(sqrt((double)n)+1);i+=2)
if(!(n%i))
return 0;
return 1;
}
应用例子-歌德巴赫猜想
验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立)。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int flag(int n);
int i,n;
for(i=4;i<2000;i+=2)
{
for(n=2;n<i;n++)
if(flag(n)==1)
if(flag(i-n)==1)
{
cout<<i<<"="<<n<<"+"<<i-n<<endl;
break;
}
}
return 0;
}
int flag(int n)
{
if(n<=1) return 0;
if(n==2) return 1;
if(!(n%2)) return 0;
for(int i=3;i<(int)(sqrt((double)n)+1);i+=2)
if(!(n%i))
return 0;
return 1;
}