您的位置:首页 > 其它

有一个四位数 a1a2a3a4,每一位数都是0到9之间的一个数字(多种解法)

2016-06-05 22:01 399 查看
上个月去面试,觉得很长知识!尤其是在算法中,这是一道以前在参加蓝桥杯中碰到过的题目,

但是第一次用这么久来想这道题。不知道这位大神有没有看到这篇博客,我在这里谢谢他,让我学会思考。

题目如下:

        有一位四位数a1a2a3a4,每一位数都是0到9之间的一个数字,要求这四位数。满足下面两个条件:

        

        a1 + a2 + a3 + a4 = 20

       

        a1  < a2 < a3 < a4

接下来我写下两种实现的方式 :

解题分析:

共两种思路,第一种是暴力破解的方式,对条件a1, a2, a3, a4分别遍历然后判断,但这样十分费时!

                      第二种是数学方法,先证明出a1, a2, a3, a4所取得的最大值,然后缩小范围,降低时间复杂度!

第一种暴力破解:

//杨鑫
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
for(int a1 = 1; a1 <= 9; a1++)
{
for(int a2 = 0; a2 <= 9; a2++)
{
for(int a3 = 0; a3 <= 9; a3++)
{
for(int a4 = 0; a4 <= 9; a4++)
{
if(a1 + a2 + a3 + a4 == 20 && a1 < a2 && a1 < a3 && a1 < a4 && a2 < a3 && a2 < a4 && a3 < a4)
cout<<"a1 = "<<a1<<" , "<<"a2 = "<<a2<<" , "<<"a3 = "<<a3<<" , "<<"a4 = "<<a4<<endl;
}
}
}
}
}


   



第二种方式:数学方式

//杨鑫
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a1Max, a2Max, a3Max, a4Max;
a1Max = (20 - 6)/3 - 1;
a2Max = (20 - 1 - 2 -3)/3;
a3Max = 8;
a4Max = 9;
cout<<"a1, a2, a3, a4分别为如下:"<<endl;
for(int a1 = 1; a1 <= a1Max; a1++)
{
for(int a2 = 2; a2 <= a2Max; a2++)
{
for(int a3 = 3; a3 <= a3Max; a3++)
{
for(int a4 = 4; a4 <= a4Max; a4++)
{
if(a1 + a2 + a3 + a4 == 20 && a1 < a2 && a2 < a3 && a2 < a4 && a3 < a4)
{
cout<<a1<<" , "<<a2<<" , "<<a3<<" , "<<a4<<endl;
}

}
}
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: