经典算法(1~30)(一)

【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
掉不满足条件的排列。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i, j, k, count=0;
 6     for(i=1; i<=4; i++)
 7     {
 8         for(j=1; j<=4; j++)
 9         {
10             for(k=1; k<=4; k++)
11             {
12                 if(i==j || i==k || j==k)
13                     continue;
14                 else
15                 {
16                     cout<<i*100+j*10+k<<"    ";
17                     count++;
18                     if(count%10==0)
19                         cout<<endl;
20                 }
21             }
22         }
23     }
24     cout<<"sum="<<count<<endl;
25     system("pause");
26     return 1;
27 }

进一步考虑输出格式,输出的三位数不一定非得乘上各自基数相加,依次输出即可

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i, j, k, count=0;
 6     for(i=1; i<=4; i++)
 7     {
 8         for(j=1; j<=4; j++)
 9         {
10             for(k=1; k<=4; k++)
11             {
12                 if(i==j || i==k || j==k)
13                     continue;
14                 else
15                 {
16                     //cout<<i*100+j*10+k<<"    ";
17                     cout<<i<<j<<k<<"    ";
18                     count++;
19                     if(count%10==0)
20                         cout<<endl;
21                 }
22             }
23         }
24     }
25     cout<<"sum="<<count<<endl;
26     system("pause");
27     return 1;
28 }

进一步,直接找到符合条件的输出,不符合条件的舍弃,即采用 if 来精简 if…else结构,并对换行符的判断进行简化

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i, j, k, count=0;
 6     for(i=1; i<=4; i++)
 7     {
 8         for(j=1; j<=4; j++)
 9         {
10             for(k=1; k<=4; k++)
11             {
12                 //if(i==j || i==k || j==k)
13                 //    continue;
14                 //else
15                 //{
16                 //    //cout<<i*100+j*10+k<<"    ";
17                 //    cout<<i<<j<<k<<"    ";
18                 //    count++;
19                 //    if(count%10==0)
20                 //        cout<<endl;
21                 //}
22                 if(i!=j && i!=k && j!=k)
23                 {
24                     cout<<i<<j<<k<<"    ";
25                     if(++count%10==0)
26                         cout<<endl;
27                 }
28             }
29         }
30     }
31     cout<<"sum="<<count<<endl;
32     system("pause");
33     return 1;
34 }

==============================================================

【程序2】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i;
 6     cin>>i;
 7     if(i<10 && i>=0)    cout<<i*1000<<endl;
 8     else if(i<20 && i>=10) cout<<10000+(i-10)*750<<endl;
 9     else if(i<40 && i>=20) cout<<10000+7500+(i-20)*500<<endl;
10     else if(i<60 && i>=40) cout<<10000+7500+10000+(i-40)*300<<endl;
11     else if(i<100 && i>=60) cout<<10000+7500+10000+6000+(i-60)*150<<endl;
12     else if(i>=100) cout<<10000+7500+10000+6000+6000+(i-100)*100<<endl;
13     else cout<<"error input"<<endl;
14     system("pause");
15     return 1;
16 }

参考代码如下,可读性更高,仅考虑正确输入情况

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i, bonus1, bonus2, bonus4, bonus6, bonus10, bonus;
 6     cin>>i;
 7     bonus1=100000*0.1; bonus2=bonus1+100000*0.075;
 8     bonus4=bonus2+200000*0.05; bonus6=bonus4+200000*0.03;
 9     bonus10=bonus6+400000*0.015;
10     if(i<=100000)    bonus=i*0.1;
11     else if(i<=200000) bonus=bonus1+(i-100000)*0.075;
12     else if(i<=400000) bonus=bonus2+(i-200000)*0.05;
13     else if(i<=600000) bonus=bonus4+(i-400000)*0.03;
14     else if(i<=1000000) bonus=bonus6+(i-600000)*0.015;
15     else bonus=bonus10+(i-1000000)*0.01;
16     cout<<bonus<<endl;
17     system("pause");
18     return 1;
19 }

==============================================================

【程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
的结果满足如下条件,即是结果。请看具体分析:

 1 #include<iostream>
 2 #include<math.h>
 3 using namespace std;
 4 int panduan(int i);
 5 int main()
 6 {
 7     int i;
 8     for(i=0; i<=100000;i++)
 9         if(panduan(i))
10             cout<<i<<endl;
11     system("pause");
12     return 1;
13 }
14 int panduan(int i)
15 {
16     int flag1=0,flag2=0;
17     float r1=i+100;
18     float r2=i+268;
19     int max=(int)sqrt(r2)+1;
20     for(int j=1; j<max; j++)
21     {
22         if( fabs((float)(j*j)-r1)<0.0001)
23             flag1=1;
24         if( fabs((float)(j*j)-r2)<0.0001)
25             flag2=1;
26     }
27     //cout<<flag1<<"    "<<flag2<<endl;
28     if(flag1==1 && flag2==1)
29         return 1;
30     else
31         return 0;
32 }

参考代码的代码量少且思路独特

 1 #include<iostream>
 2 #include<math.h>
 3 using namespace std;
 4 int main()
 5 {
 6     long int i,x,y,z;
 7     for(i=1; i<22; i++)
 8     {
 9         x=sqrt(i+100);
10         y=sqrt(i+296);
11         //cout<<"x="<<x<<"    y="<<y<<endl;
12         if(x*x==i+100 && y*y==i+268)
13             cout<<i<<endl;
14     }
15     system("pause");
16     return 1;
17 }
时间: 2024-11-05 11:47:34

经典算法(1~30)(一)的相关文章

白话经典算法系列之七 堆与堆排序

堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值. 2.每一个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于不论什么一个子节点的键值时为最大堆.当父结点的键值总是小于或等于不论什么一个子节点的键值时为最小堆.下图展示一个最小堆

经典算法mark

在平时找工作的时候,或多或少会遇到一些算法问题,很多都是比较经典或者网上已经流传很久的.只是我们没有接触过,所以不知道怎么解决. 在这儿,我自己总结一些我遇到的一些经典算法,给自己增加一点记忆,也给需要的朋友看到学习一下. 1. 倒水问题 如题:一个容量为5升的杯子和一个容量为3升的杯子,水不限使用,要求精确得到4升水. 这类题一般会有两种出题方式: A.简答 这儿先给出简答的答案:其实结果又很多种,这儿给出倒水次数最少的一种. B.编程实现 解法也比较多,我首先想到的DFS(深度优先)搜索,每

数据挖掘经典算法——先验算法

算法描述 先验算法是实现频繁项挖掘的一种经典算法,利用关联式规则不断扩展频繁项子集以获得全部的频繁项集合.解释一下关联式规则,所谓关联式是指在大量的数据中找出的项与项之间的关系.例如消费者购买了产品A,一般都会购买产品B,这就是一条关联式. 先验算法被设计用来处理包含事务的数据库,这里的每一个事务都被当成是一组项集,给定一个阈值C,我们需要找出至少出现C次的事务子集(即子项).这边这个C值就是最小支持度,规定了一个项集出现多少次才能被认为是一个频繁项. 先验算法的核心思想基于以下一个事实:一个项

【经典算法大全】收集51种经典算法 初学者必备

<经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博客贴了出来,但是自己写写感觉总是好的.现在分享个大家. 代码和运行结果难免有出错的地方,请大家多多包涵. 1.河内之塔(汉诺塔) 2.费式数列 3.巴斯卡三角形 4.三色棋 5.老鼠走迷宫(1) 6.老鼠走迷宫(2) 7.骑士走棋盘 8.八皇后 9.八枚银币 10.生命游戏 11.字串核对 12.双色河内塔,

经典算法大全

原文地址:经典算法大全 作者:liurhyme 经                                                                    典                                                                    算                                                                    法                  

白话经典算法系列之七 堆与堆排序(转)

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示一个最小堆: 由于其它几

Java经典算法案例

笔试中的编程题3 JAVA经典算法40例[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{public static void main(String args[]){int i=0;for(i=1;i<=20;i++)System.out.println(f(i));}pu

javascript常用经典算法实例详解

javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与使用技巧,需要的朋友可以参考下 本文实例讲述了javascript常用算法.分享给大家供大家参考,具体如下: 入门级算法-线性查找-时间复杂度O(n)--相当于算法界中的HelloWorld ? 1 2 3 4 5 6 7 8 9 10 //线性搜索(入门HelloWorld) //A为数组,x为要

【转】白话经典算法系列之七 堆与堆排序

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示一个最小堆: 由于其它几

经典算法题每日演练——第十六题 Kruskal算法

原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0,1,2,3,4,5}这样6个节点,我们知道Prim算法构建生成树是从”顶点”这个角度来思考的,然后采用“贪心思想” 来一步步扩大化,最后形成整体最优解,而Kruskal算法有点意思,它是站在”边“这个角度在思考的,首先我有两个集合. 1. 顶点集合(vertexs): 比如M集合中的每个元素都可以认