常见的算法 快速分析解决

冒泡法                                                                                           
题目:用冒泡法从键盘输入10个数字,编写代码对他排序
分析:
      冒泡法排序将待排序的元素看做是垂直的气泡,值较小的元素比较轻,往上浮动,在这里算法中需要对这组“气泡”出来若干次;每处理一次,就对两个相邻的“气泡”的值进行交换,当位置较高的“气泡”大于另一个“气泡”的值,则可以通过临时变量将两个“气泡”的值交换,所以此时,第一次处理后,最轻的“气泡”值就浮到最高的位置,第二次处理后,第二轻的数据浮到第二高的位置。一般处理N次以后,这时就没有必要比较第N高位置以上的“气泡”,因为此时差不多的“气泡”都正确排好了序.
代码如下
复制代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  bubble_sort
{
class  Program
{
static void  Main( string [] args)
{
int  a, b,temp;
int [] Bubble_sort_arr  = new int [ 10 ]; // 定义类型为int的数组Bubble_sort_arr
Console.WriteLine( " 请输入10个整数 " );
for  (a = 0 ; a  < 10 ;a ++  ) // 将输入的10个数字存储于数组的子项当中
{
Bubble_sort_arr[a] 
=  Convert.ToInt32(Console.ReadLine());
}
for  (b  =  Bubble_sort_arr.Length  - 1 ; b  > 0 ;b --  ) // 经过2层的循环,将数组中的子项数值进行交换
{
for (a = 0 ;a < b;a ++ )
{
// 当前一项大于后一项的时候,将交换两项的位置
if  (Bubble_sort_arr[a]  >  Bubble_sort_arr[a  + 1 ])
{
temp 
=  Bubble_sort_arr[a];
Bubble_sort_arr[a] 
=  Bubble_sort_arr[a  + 1 ];
Bubble_sort_arr[a 
+ 1 =  temp;
}
}

}
Console.WriteLine(
" 排好序的10个整数是 " );
for  (a  = 0 ; a  <  Bubble_sort_arr.Length;a ++  )
{
Console.WriteLine(Bubble_sort_arr[a].ToString());
}
Console.ReadLine();

}
}
}
复制代码
结果:
 
  递归法                                                                                            
题目:递归法对一组的排序规则为:1、1、2、3、5、8、13、21、34........请求第50位的数值
分析:
      从给出的数字序列当中发现规律,第1个数字和第2个数字相加之和为第3个数;第2个数和第3个数的和为第4个数,依次类推,可知道第N-1个数字和第N个数字相加的和为第N+1数字,此时可以得到如下规律:
      当N=0;或者N=1时,F(N)=1;      当N>1时,F(N)=F(N-1)+F(N-2);此时不难得到第50个数字是多少了...如图:
代码如下
复制代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  Recursion
{
class  Program
{
static void  Main( string [] args)
{

Console.WriteLine(
" 输出第50为的是{0} " ,GetNumber( 49 ));
Console.ReadKey();
}
static int  GetNumber( int  N)
{
if  (N  <= 1 )
{
return 1 ;


return  GetNumber(N  - 1 +  GetNumber(N  - 2 );

}
}
}
复制代码
 
 高斯求和                                                                                         
高斯求和:整数1--100求和的问题根据数学家高斯给出著名的解决方法,请用算法实现..
分析:

在这里就不说高斯是怎么实现求和的故事了,你想知道的可以看http://zhidao.baidu.com/question/10587649.html,直接给一张图:

代码如下:
 
复制代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  Gaussian_summation
{
class  Program
{
static void  Main( string [] args)
{
// 定义两个int类型变量 a,sum,a用于计数和索引,sum用于存储相加结果
int  a, sum  = 0 ;
int [] Arr  = new int [ 100 ]; // 定义int类型数组,Arr包括100个子项
for (a = 0 ;a < Arr.Length;a ++ ) // 开始循环,从0-99,将a赋予当前数组子项
{
Arr[a]
= a + 1 ;
}
for  (a  = 0 ; a  <  Arr.Length / 2 ;a ++  ) // 循环,次数为数组一半
{
sum 
+=  Arr[a]  +  Arr[Arr.Length  -  a  - 1 ]; // 将数组a索引的子项和数组尾端计数第a的位置的子项相加,将结果赋值给sum
}
Console.WriteLine(sum.ToString());
Console.ReadLine();

}
}
}
复制代码
 
结果:
 

常见的算法快速分析解决(二)

2011-06-10 18:27 by 类菌体, 1387 visits, 收藏编辑

斐波那契数列                                                                                  
题目:斐波那契数列,FIBONACCI数列特点是第1,第2两个数为1,1.从第3个数开始,该数是前两个数之和,求这个数列的前30个元素
分析:費波那西數列(Fibonacci Sequence),又譯 費波拿契數斐波那契數列費氏數列黃金分割數列。在 數學上, 費波那西數列是以 遞歸的方法來定義:
F 0 = 0
F 1 = 1
Fn =  Fn - 1 +  Fn  - 2
用文字來說,就是費波那西數列由 0 和 1 開始,之後的費波那西係數就由之前的兩數相加。首幾個費波那西係數是( OEIS  A000045):
01123581321345589144233377610, 987, 1597, 2584,
4181, 6765, 10946,………………
特別指出: 0不是第一項,而是第零項 。(参考)
分析题目我们可以用如下等式来表示斐波那契数列:
F1=1----(n=1);
F2=1----(n=1);
Fn=F(n-1)+F(n-2)-----(n>=3)
这里我们将F的下标看成是数组的下标
代码如下:
复制代码
#include < stdio.h >
#include
< stdlib.h >
int  main()
{
int  i; /* 定义整形变量 */
long  f[ 31 ]; /* 定义数组为长整形 */
f[
1 ] = f[ 2 ] = 1 ; /* 数组的f[1],f[2]赋值为1 */
for ( int  i = 3 ;i < 31 ;i ++ )
{
f[i]
= f[i - 1 ] + f[i - 2 ]; /* 数组从第三行开始,每一项等于前两项之和 */
}
for (i = 1 ;i < 31 ;i ++ )
{
printf(
" %10ld " ,f[i]); /* 输出数组中的30个元素 */
if (i % 5 == 0 )
printf(
" \n " ); /* 每5个元素进行一次换行 */
}
system(
" PAUSE " ); 
}
复制代码
 结果:
 
 角谷猜想                                                                                      
题目:角谷猜想 ,任意一个自然数,当他为偶数的时候则除以2,当他为奇数的时候则乘3加1,得到一个新的自然数,依次按照这个法则继续演算,到很多次以后,就会得到一个结果,这个结果是1...
分析:考拉兹猜想,又称为3n+1猜想、冰雹猜想、角谷猜想、哈塞猜想、乌拉姆猜想或叙拉古猜想,是指对于每一个正 整数,如果它是 奇数,则对它乘3再加1,如果它是 偶数,则对它除以2,如此循环,最终都能够得到1。( 维基百科)
有题目分析可知,重点是判断一个数是奇数还是偶数,程序采用对2取余的方法,当余数为0时,说明该数为偶数,否则为奇数
举例:取一个数字

如n = 6,根据上述数式,得出 6→3→10→5→16→8→4→2→1 。(步驟中最高的數是16,共有7個步驟)

如n = 11,根据上述数式,得出 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1。(步驟中最高的數是40,共有13個步驟)

如n = 27,根据上述数式,得出 : 27→82→41→124→62→31→94→47→142→71→214→107→322→161→484→242→121→364→182→91→274→137→412→206→103→310→155→466→233

→700→350→175→526→263→790→395→1186→593→1780→890→445→1336→668→334→167→502→251→754→377→1132→566→283→850→425→1276

→638→319→958→479→1438→719→2158→1079→3238→1619→4858→2429→7288→3644→1822→911→2734→1367→4102→2051→6154→3077→9232

→4616→2308→1154→577→1732→866→433→1300→650→325→976→488→244→122→61→184→92→46→23→70→35→106→53→160→80→40→20→10

→5→16→8→4→2→1。(步驟中最高的數是9232,共有111個步驟)

考拉兹猜想称,任何正整数,经过上述计算步骤後,最终都会得到 1 。
代码:
复制代码
#include < stdio.h >
#include
< stdlib.h >
void  main()
{
long  i,n;  // 定义变量为长整形
printf( " please input a number:\n " ); // 输入任意一个长整形数
scanf( " %ld " , & n);
while (n != 1 )
{
if (n % 2 == 0 // 判断是否为偶数
{
printf(
" %ld/2=%ld\n " ,n,n / 2 ); // 当为偶数的时候n除以2
n = n / 2 ;
}
else
{
printf(
" %ld*3+1=%ld\n " ,n,n * 3 + 1 ); // 当我奇数时乘以3加1
n = n * 3 + 1 ;
}
}
system(
" pause " );

}
复制代码
结果:
 
 歌德巴赫猜想                                                                                 
题目:歌德巴赫猜想,验证100以内的的正偶数都能分解为两个素数之和
分析:任一大於2的偶數,都可表示成兩個質數之和
將一給定的偶數表示成兩個質數之和被稱之為此數的 哥德巴赫分割。例如,
  4 = 2 + 2
  6 = 3 + 3
  8 = 3 + 5
10 = 3 + 7 = 5 + 5
12 = 5 + 7
14 = 3 + 11 = 7 + 7
換句話說,哥德巴赫猜想主張每個大於等於4的偶數都是 哥德巴赫數-可表示成兩個質數之和的數 [1]。哥德巴赫猜想也是 希爾伯特第八問題中的一個子問題。
另有對奇數的相似猜想,稱之為 勒穆瓦纳猜想(Lemoine's conjecture)或李維猜想(Levy's conjecture)。
为了验证哥德巴赫猜想对100以内的正偶数成立,所以要将正偶数分为两部分,在对这两部分进行判断,如果均是素数则满足体艺,不是的话,则重新分解继续判断
代码:
复制代码
#include < stdio.h >
#include
< stdlib.h >
int  ss( int  i) /* 自定义一个函数是不是素数 */
{
int  j;
if (i <= 1 ) /* 小于1的不是素数 */
return 0 ;
if (i == 2 /* 2是素数 */
return 1 ;
for (j = 2 ;j < i;j ++ ) /* 对大于2的进行判断 */
{
if (i % j == 0 )
return 0 ;
else if (i != j + 1 )
return 1 ;
}

}
void  main()
{
int  i,j,k,flag1,flag2,n = 0 ;
for (i = 6 ;i < 100 ;i += 2 )
for (k = 2 ;k <= i;k ++ )
{
j
= i - k;
flag1
= ss(k);
if (flag1)  /* 判断拆分的数是不是素数 */
{
flag2
= ss(j);
if (flag2)  /* 如果拆分出来的数是素数则输出 */
{
printf(
" %3d=%3d+%3d " ,i,j,k);
n
++ ;
if (n % 5 == 0 )
printf(
" \n " );
}
}
}
system(
" pause " );
}

复制代码
结果:
 
四方定理                                                                                      
题目:四方定理,所有的自然数至多只要4个数的平方和就可以表示,编程验证
可以采用穷举试探的方法进行计算,当满足定理的条件就可以输出结果
 
代码:
复制代码
#include < stdio.h >
#include
< stdlib.h >
int  main()
{
long  i,j,k,l,n; // 定义变量为长整形
printf( " 请输入 一个长整形的整数 " );
scanf(
" %ld " , & n);
for (i = 0 ;i < n;i ++ // 对i,j,k,l进行穷举
for (j = 0 ;j < i;j ++
for (k = 0 ;k < j;k ++ )
for (l = 0 ;l < k;l ++ )
if (i * i + j * j + k * k + l * l == n) // 判断是否满足定理要求
{
printf(
" %ld*%ld+%ld*%ld+%ld*%ld+%ld*%ld=%ld\n " ,i,i,j,j,k,k,l,l,n); // 将满足要求的结果输出


}
system(
" pause " );

}
复制代码
  
 结果:
  
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值