C++设计例子 (3)

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;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值