100个经典算法

C++语言: 临时自用代码
POJ 上做做 ACM 的题

语言的学习基础 , 100 个经典的算法
C 语言的学习要从基础开始,这里是 100 个经典的算法-1 C 语言的学习要从基础开始,这里是 100 个经典的算法

题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔

子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数

为多少?


__________________________________________________________________


程序分析:兔子的规律为数列 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21. ...


___________________________________________________________________

程序源代码:
main()
{
long f1 , f2;
int i;
f1 = f2 = 1;
for( i = 1; i <= 20; i ++)
  { printf( "%12ld %12ld" , f1 , f2);
    if( i % 2 == 0) printf( " /n "); /*控制输出,每行四个*/
    f1 = f1 + f2; /*前两个月加起来赋值给第三个月*/
    f2 = f1 + f2; /*前两个月加起来赋值给第三个月*/
  }
}

上题还可用一维数组处理, you try !


题目:判断 101 - 200 之间有多少个素数,并输出所有素数。


__________________________________________________________________


程序分析:判断素数的方法:用一个数分别去除 2 sqrt( 这个数) ,如果能被整

除,则表明此数不是素数,反之是素数。


___________________________________________________________________


程序源代码:
#include "math.h"
main()
{
  int m , i , k , h = 0 , leap = 1;
  printf( " /n ");
  for( m = 101; m <= 200; m ++)
   { k = sqrt( m + 1);
    for( i = 2; i <= k; i ++)
      if( m % i == 0)
       { leap = 0; break ;}
    if( leap) { printf( "%-4d" , m); h ++;
         if( h % 10 == 0)
         printf( " /n ");
        }
    leap = 1;
   }
  printf( " /n The total is %d" , h);
}


题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位

数字立方和等于该数本身。例如: 153 是一个“水仙花数”,因为 153 = 1 的三次方

5 的三次方+ 3 的三次方。


__________________________________________________________________


程序分析:利用 for 循环控制 100 - 999 个数,每个数分解出个位,十位,百位。


___________________________________________________________________


程序源代码:
main()
{
int i , j , k ,n;
printf( "'water flower'number is:");
  for(n = 100;n < 1000;n ++)
  {
   i =n / 100; /*分解出百位*/
   j =n / 10 % 10; /*分解出十位*/
   k =n % 10; /*分解出个位*/
   if( i * 100 + j * 10 + k == i * i * i + j * j * j + k * k * k)
    {
    printf( "%-5d" ,n);
    }
  }
printf( " /n ");
}



题目:将一个正整数分解质因数。例如:输入 90 , 打印出 90 = 2 * 3 * 3 * 5


__________________________________________________________________



程序分析:对n 进行分解质因数,应先找到一个最小的质数 k ,然后按下述步骤完

成:
( 1) 如果这个质数恰等于n ,则说明分解质因数的过程已经结束,打印出即可。
( 2) 如果n <> k ,但n 能被 k 整除,则应打印出 k 的值,并用n 除以 k 的商 , 作为新的正

整数你n , 重复执行第一步。
( 3) 如果n 不能被 k 整除,则用 k + 1 作为 k 的值 , 重复执行第一步。


___________________________________________________________________



程序源代码:
/* zheng int is divided yinshu*/
main()
{
int n , i;
printf( " /n please input a number: /n ");
scanf( "%d" , &n);
printf( "%d=" ,n);
for( i = 2; i <=n; i ++)
  {
   while(n != i)
   {
    if(n % i == 0)
    { printf( "%d*" , i);
    n =n / i;
    }
    else
     break;
   }
}
printf( "%d" ,n);
}


题目:利用条件运算符的嵌套来完成此题:学习成绩 >= 90 分的同学用 A 表示, 60

- 89 分之间的用B 表示, 60 分以下的用 C 表示。


__________________________________________________________________


程序分析:( a >b) ? a:b 这是条件运算符的基本例子。


___________________________________________________________________


程序源代码:
main()
{
  int score;
  char grade;
  printf( "please input a score /n ");
  scanf( "%d" , & score);
  grade = score >= 90 ? 'A' score >= 60 ? 'B' : 'C');
  printf( "%d belongs to %c" , score , grade);
}



题目:输入两个正整数 m n ,求其最大公约数和最小公倍数。


__________________________________________________________________


程序分析:利用辗除法。


___________________________________________________________________


程序源代码:
main()
{
  int a ,b , num1 , num2 , temp;
  printf( "please input two numbers: /n ");
  scanf( "%d,%d" , & num1 , & num2);
  if( num1   { temp = num1;
   num1 = num2; 
   num2 = temp;
  }
a = num1;b = num2;
while(b != 0) /*利用辗除法,直到b为0为止*/
  {
   temp = a %b;
   a =b;
  b = temp;
  }
printf( "gongyueshu:%d /n " , a);
printf( "gongbeishu:%d /n " , num1 * num2 / a);
}


题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数




__________________________________________________________________


程序分析:利用 while 语句 , 条件为输入的字符不为 '/n' .


___________________________________________________________________


程序源代码:
#include "stdio.h"
main()
{ char c;
  int letters = 0 , space = 0 , digit = 0 , others = 0;
  printf( "please input some characters /n ");
  while(( c = getchar()) != '/n')
  {
  if( c >= 'a' && c <= 'z'|| c >= 'A' && c <= 'Z')
   letters ++;
  else if( c == ' ')
   space ++;
    else if( c >= '0' && c <= '9')
        digit ++;
      else
        others ++;
}
printf( "all in all:char=%d space=%d digit=%d others=%

d /n ",letters,space,digit,others);
}


题目:求s = a + aa + aaa + aaaa + aa ... a 的值,其中 a 是一个数字。例如

2 + 22 + 222 + 2222 + 22222( 此时共有 5 个数相加) ,几个数相加有键盘控制。


__________________________________________________________________


程序分析:关键是计算出每一项的值。


___________________________________________________________________


程序源代码:
main()
{
  int a ,n , count = 1;
  long int sn = 0 , tn = 0;
  printf( "please input a and n /n ");
  scanf( "%d,%d" , & a , &n);
  printf( "a=%d,n=%d /n " , a ,n);
  while( count <=n)
  {
   tn = tn + a;
  sn =sn + tn;
   a = a * 10;
   ++ count;
  }
printf( "a+aa+...=%ld /n " ,sn);
}


题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6 = 1 2

3. 编程找出 1000 以内的所有完数。


___________________________________________________________________


程序源代码:
main()
{
static int k [ 10 ];
int i , j ,n ,s;
for( j = 2; j < 1000; j ++)
  {
 n =- 1;
 s = j;
   for( i = 1; i    {
    if(( j % i) == 0)
    { n ++;
    s =s - i;
     k [n ] = i;
    }
   }
  if(s == 0)
  {
  printf( "%d is a wanshu" , j);
  for( i = 0; i   printf( "%d," , k);
  printf( "%d /n " , k [n ]);
  }
}
}



题目:一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,

求它在第 10 次落地时,共经过多少米?第 10 次反弹多高?


___________________________________________________________________


程序源代码:
main()
{
float sn = 100.0 , hn =sn / 2;
int n;
for(n = 2;n <= 10;n ++)
  {
  sn =sn + 2 * hn; /*第n次落地时共经过的米数*/
   hn = hn / 2; /*第n次反跳高度*/
  }
printf( "the total of road is %f /n " ,sn);
printf( "the tenth is %f meter /n " , hn);
}


题目:一只猴子摘了N 个桃子第一天吃了一半又多吃了一个 , 第二天又吃了余下的

一半又多吃了一个 , 到第十天的时候发现还有一个 .


___________________________________________________________________


程序源代码:
/* 猴子吃桃问题 */
main()
{
int i ,s ,n = 1;
for( i = 1; i < 10; i ++)
{
s =(n + 1) * 2
n =s;
}
printf( "第一天共摘了%d个桃 /n " ,s);
}



迭代法求方程根

___________________________________________________________________



/* 迭代法求一个数的平方根 */
#define Epsilon 1.0E-6 /*控制解的精度*/
#include<math.h>
main()
{
float a , x0 , x1;
printf( "请输入要求的数:");
scanf( "%f" , & a);
x0 = a / 2;
x1 =( x0 + a / x0) / 2;
while( fabs( x1 - x0) >= Epsilon)
   {
   x0 = x1;
   x1 =( x0 + a / x0) / 2;
   }
printf( "%f的平方根:%f.5 /n " , x1);
}



/* 上题的另一种算法 */
#define Epsilon 1.0E-6 /*控制解的精度*/
#include <stdio.h>
#include <math.h>
main()
{
float num , pre , this;
do
   {
   scanf( "%f" , & num); /*输入要求平方根的数*/
   } while( num < 0);
if ( num == 0)
   printf( "the root is 0");
else
   {
   this = 1;
   do
   {
     pre = this;
     this =( pre + num / pre) / 2;
     } while( fabs( pre - this) > Epsilon); /*用解的精度,控制循环次数*/
   }
printf( "the root is %f" , this);
}


用牛顿迭代法 求方程 2 * x * x * x - 4 * x * x + 3 * x - 6 的根
/* 牛顿迭代法 */
#define Epsilon 1.0E-6 /*控制解的精度*/
#include<math.h>
main()
{
   float x1 , x0 = 1.5;
   x1 = x0 -( 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) /( 6 * x0 * x0 - 8 * x0 + 3);
   while( fabs( x1 - x0 >= Epsilon)
   {  
       x0 = x1;
       x1 = x0 -( 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) /( 6 * x0 * x0 - 8 * x0 + 3);
   }
   printf( "方程的根为%f /n " , x1);
}


用二分法求上题
/* 二分法 */
#define Epsilon 1.0E-5 /*控制解的精度*/
#include<math.h>

main()
{
   folat x1 , x2 , x0 , f1 , f2 , f0;
   x0 =( x1 + x2) / 2;
   f0 = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;   /* 求中点的函数值 */
   while( fabs( f0) >= Epsilon)
   {
     if( f0 * f1 < 0)
     { x2 = x0;
f2 = 2 * x2 * x2 * x2 - 4 * x2 * x2 + 3 * x2 - 6;
     }
     if( f0 * f2 < 0)
     { x1 = x0;
f1 = 2 * x1 * x1 * x1 - 4 * x1 * x1 + 3 * x1 - 6;
     }
     x0 =( x1 + x2) / 2;
     f0 = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;
   }
   printf( "用二分法求得方程的根:%f /n " , x0);
}


题目:打印出如下图案(菱形)

*
***
******
********
******
***
*

___________________________________________________________________


程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利

用双重 for 循环,第一层控制行,第二层控制列。

___________________________________________________________________


程序源代码:
main()
{
int i , j , k;
for( i = 0; i <= 3; i ++)
  {
  for( j = 0; j <= 2 - i; j ++)
   printf( " ");
  for( k = 0; k <= 2 * i; k ++)
   printf( "*");
  printf( " /n ");
  }
for( i = 0; i <= 2; i ++)
  {
  for( j = 0; j <= i; j ++)
   printf( " ");
  for( k = 0; k <= 4 - 2 * i; k ++)
   printf( "*");
  printf( " /n ");
  }
}


题目:一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,

十位与千位相同。

___________________________________________________________________


程序分析:同 29

___________________________________________________________________


程序源代码:
main( )
{
long ge , shi , qian , wan , x;
scanf( "%ld" , & x);
wan = x / 10000;
qian = x % 10000 / 1000;
shi = x % 100 / 10;
ge = x % 10;
if ( ge == wan && shi == qian) /*个位等于万位并且十位等于千位*/
  printf( "this number is a huiwen /n ");
else
  printf( "this number is not a huiwen /n ");
}



题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,

则继续判断第二个字母。

___________________________________________________________________


程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或 if

句判断第二个字母。

___________________________________________________________________


程序源代码:
#include <stdio.h>
void main()
{
char letter;
printf( "please input the first letter of someday /n ");
while (( letter = getch()) != 'Y') /*当所按字母为Y时才结束*/
{ switch ( letter)
{ case 'S' : printf( "please input second letter /n ");
      if(( letter = getch()) == 'a')
       printf( "saturday /n ");
      else if (( letter = getch()) == 'u')
          printf( "sunday /n ");
        else printf( "data error /n ");
      break;
case 'F' : printf( "friday /n "); break;
case 'M' : printf( "monday /n "); break;
case 'T' : printf( "please input second letter /n ");
      if(( letter = getch()) == 'u')
       printf( "tuesday /n ");
      else if (( letter = getch()) == 'h')
          printf( "thursday /n ");
        else printf( "data error /n ");
      break;
case 'W' : printf( "wednesday /n "); break;
default : printf( "data error /n ");
   }
  }
}


题目: Press any key to change color , do you want to try it . Please

hurry up !

___________________________________________________________________


程序源代码:
#include <conio.h>
void main( void)
{
int color;
for ( color = 0; color < 8; color ++)
  {
  textbackground( color); /*设置文本的背景颜色*/
  cprintf( "This is color %d /r/n " , color);
  cprintf( "ress any key to continue /r/n ");
  getch(); /*输入字符看不见*/
  }
}


题目:学习 gotoxy() clrscr() 函数

___________________________________________________________________


程序源代码:
#include <conio.h>
void main( void)
{
clrscr(); /*清屏函数*/
textbackground( 2);
gotoxy( 1 , 5); /*定位函数*/
cprintf( "Output at row 5 column 1 /n ");
textbackground( 3);
gotoxy( 20 , 10);
cprintf( "Output at row 10 column 20 /n ");
}



题目:练习函数调用

___________________________________________________________________


程序源代码:
#include <stdio.h>
void hello_world( void)
{
printf( "Hello, world! /n ");
}
void three_hellos( void)
{
int counter;
for ( counter = 1; counter <= 3; counter ++)
hello_world(); /*调用此函数*/
}
void main( void)
{
three_hellos(); /*调用此函数*/
}



题目:文本颜色设置

___________________________________________________________________


程序源代码:
#include <conio.h>
void main( void)
{
int color;
for ( color = 1; color < 16; color ++)
  {
  textcolor( color); /*设置文本颜色*/
  cprintf( "This is color %d /r/n " , color);
  }
textcolor( 128 + 15);
cprintf( "This is blinking /r/n ");
}


题目:求 100 之内的素数

___________________________________________________________________


程序源代码:
#include <stdio.h>
#include "math.h"
#define N 101
main()
{
int i , j , line , a [N ];
for( i = 2; i <N; i ++) a = i;
for( i = 2; i < sqrt(N); i ++)
  for( j = i + 1; j <N; j ++)
  {
   if( a != 0 && a [ j ] != 0)
   if( a [ j ] % a == 0)
   a [ j ] = 0 ;}
printf( " /n ");
for( i = 2 , line = 0; i <N; i ++)
{
  if( a != 0)
  { printf( "%5d" , a);
  line ++ ;}
  if( line == 10)
  { printf( " /n ");
line = 0 ;}
}
}


题目:对 10 个数进行排序

___________________________________________________________________


程序分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与第一个

元素交换,下次类推,即用第二个元素与后 8 个进行比较,并进行交换。    

   
程序源代码:
#define N 10
main()
{ int i , j , min , tem , a [N ];
/*input data*/
printf( "please input ten num: /n ");
for( i = 0; i <N; i ++)
{
printf( "a[%d]=" , i);
scanf( "%d" , & a );}
printf( " /n ");
for( i = 0; i <N; i ++)
printf( "%5d" , a);
printf( " /n ");
/*sort ten num*/
for( i = 0; i <N - 1; i ++)
{ min = i;
for( j = i + 1; j <N; j ++)
if( a [ min ] > a [ j ]) min = j;
tem = a;
a = a [ min ];
a [ min ] = tem;
}
/*output data*/
printf( "After sorted /n ");
for( i = 0; i <N; i ++)
printf( "%5d" , a);
}


题目:求一个 3 * 3 矩阵对角线元素之和

___________________________________________________________________


程序分析:利用双重 for 循环控制输入二维数组,再将 a 累加后输出。

___________________________________________________________________


程序源代码:
main()
{
float a [ 3 ][ 3 ], sum = 0;
int i , j;
printf( "please input rectangle element: /n ");
for( i = 0; i < 3; i ++)
  for( j = 0; j < 3; j ++)
  scanf( "%f" , & a [ j ]);
for( i = 0; i < 3; i ++)
  sum = sum + a;
printf( "duijiaoxian he is %6.2f" , sum);
}


题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数

组中。

___________________________________________________________________


程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况

,插入后此元素之后的数,依次后移一个位置。

___________________________________________________________________


程序源代码:
main()
{
int a [ 11 ] = { 1 , 4 , 6 , 9 , 13 , 16 , 19 , 28 , 40 , 100 };
int temp1 , temp2 , number , end , i , j;
printf( "original array is: /n ");
for( i = 0; i < 10; i ++)
  printf( "%5d" , a);
printf( " /n ");
printf( "insert a new number:");
scanf( "%d" , & number);
end = a [ 9 ];
if( number > end)
  a [ 10 ] = number;
else
  { for( i = 0; i < 10; i ++)
   { if( a > number)
    { temp1 = a;
     a = number;
    for( j = i + 1; j < 11; j ++)
    { temp2 = a [ j ];
     a [ j ] = temp1;
     temp1 = temp2;
    }
    break;
    }
   }
}
for( i = 0; i < 11; i ++)
  printf( "%6d" , a);
}


题目:将一个数组逆序输出。

___________________________________________________________________


程序分析:用第一个与最后一个交换。

___________________________________________________________________


程序源代码:
#define N 5
main()
{ int a [N ] = { 9 , 6 , 5 , 4 , 1 }, i , temp;
  printf( " /n original array: /n ");
  for( i = 0; i <N; i ++)
  printf( "%4d" , a);
  for( i = 0; i <N / 2; i ++)
  { temp = a;
   a = a [N - i - 1 ];
   a [N - i - 1 ] = temp;
  }
printf( " /n sorted array: /n ");
for( i = 0; i <N; i ++)
  printf( "%4d" , a);
}



题目:学习 static 定义静态变量的用法

___________________________________________________________________


程序源代码:
#include "stdio.h"
varfunc()
{
int var = 0;
static int static_var = 0;
printf( " /40 :var equal %d /n " , var);
printf( " /40 :static var equal %d /n " , static_var);
printf( " /n ");
var ++;
static_var ++;
}
void main()
{ int i;
  for( i = 0; i < 3; i ++)
   varfunc();
}



题目:学习使用 auto 定义变量的用法

___________________________________________________________________


程序源代码:
#include "stdio.h"
main()
{ int i , num;
num = 2;
  for ( i = 0; i < 3; i ++)
  { printf( " /40 : The num equal %d /n " , num);
   num ++;
   {
   auto int num = 1;
   printf( " /40 : The internal block num equal %d /n " , num);
   num ++;
   }
  }
}


C 语言的学基础, 100 个经典的算法-2
程序源代码:
#include "stdio.h"
main()
{
int i , num;
num = 2;
for( i = 0; i < 3; i ++)
{
printf( " /40 : The num equal %d /n " , num);
num ++;
{
static int num = 1;
printf( " /40 :The internal block num equal %d /n " , num);
num ++;
}
}
}



题目:学习使用 external 的用法。

___________________________________________________________________


程序源代码:
#include "stdio.h"
int a ,b , c;
void add()
{ int a;
a = 3;
c = a +b;
}
void main()
{ a =b = 4;
add();
printf( "The value of c is equal to %d /n " , c);
}



题目:学习使用 register 定义变量的方法。

___________________________________________________________________


程序源代码:
void main()
{
register int i;
int tmp = 0;
for( i = 1; i <= 100; i ++)
tmp += i;
printf( "The sum is %d /n " , tmp);
}



题目:宏# define 命令练习( 1)

___________________________________________________________________


程序源代码:
#include "stdio.h"
#define TRUE 1
#define FALSE 0
#define SQ(x) (x)*(x)
void main()
{
int num;
int again = 1;
printf( " /40 : Program will stop if input value less than 50. /n ");
while( again)
{
printf( " /40 lease input number==>");
scanf( "%d" , & num);
printf( " /40 :The square for this number is %d /n " , SQ( num));
if( num >= 50)
  again = TRUE;
else
  again = FALSE;
}
}



题目:宏# define 命令练习( 2)

___________________________________________________________________


程序源代码:
#include "stdio.h"
#define exchange(a,b)
{ / /*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"/"*/
  int t; /
  t = a; /
  a =b; /
 b = t; /
}
void main( void)
{
int x = 10;
int y = 20;
printf( "x=%d; y=%d /n " , x , y);
exchange( x , y);
printf( "x=%d; y=%d /n " , x , y);
}



题目:宏# define 命令练习( 3)

___________________________________________________________________


程序源代码:
#define LAG >
#define SMA <
#define EQ ==
#include "stdio.h"
void main()
{ int i = 10;
int j = 20;
if( i LAG j)
printf( " /40 : %d larger than %d /n " , i , j);
else if( i EQ j)
printf( " /40 : %d equal to %d /n " , i , j);
else if( i SMA j)
printf( " /40 :%d smaller than %d /n " , i , j);
else
printf( " /40 : No such value. /n ");
}



题目:# if # ifdef 和# ifndef 的综合应用。

___________________________________________________________________


程序源代码:
#include "stdio.h"
#define MAX
#define MAXIMUM(x,y) (x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x
void main()
{ int a = 10 ,b = 20;
#ifdef MAX
printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));
#else
printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));
#endif
#ifndef MIN
printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));
#else
printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));
#endif
#undef MAX
#ifdef MAX
printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));
#else
printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));
#endif
#define MIN
#ifndef MIN
printf( " /40 : The lower one is %d /n " , MINIMUM( a ,b));
#else
printf( " /40 : The larger one is %d /n " , MAXIMUM( a ,b));
#endif
}



题目:# include 的应用练习

___________________________________________________________________


程序源代码:
test . h 文件如下:
#define LAG >
#define SMA <
#define EQ ==
#include "test.h" /*一个新文件50.c,包含test.h*/
#include "stdio.h"
void main()
{ int i = 10;
int j = 20;
if( i LAG j)
printf( " /40 : %d larger than %d /n " , i , j);
else if( i EQ j)
printf( " /40 : %d equal to %d /n " , i , j);
else if( i SMA j)
printf( " /40 :%d smaller than %d /n " , i , j);
else
printf( " /40 : No such value. /n ");
}


题目:学习使用按位与 & 。   

___________________________________________________________________


程序分析: 0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1

___________________________________________________________________


程序源代码:
#include "stdio.h"
main()
{
int a ,b;
a = 077;
b = a & 3;
printf( " /40 : The a & b(decimal) is %d /n " ,b);
b &= 7;
printf( " /40 : The a & b(decimal) is %d /n " ,b);
}



题目:学习使用按位或 |

___________________________________________________________________


程序分析: 0| 0 = 0; 0| 1 = 1; 1| 0 = 1; 1| 1 = 1            

___________________________________________________________________


程序源代码:
#include "stdio.h"
main()
{
int a ,b;
a = 077;
b = a| 3;
printf( " /40 : The a & b(decimal) is %d /n " ,b);
b |= 7;
printf( " /40 : The a & b(decimal) is %d /n " ,b);
}



题目:学习使用按位异或 ^ 。   

___________________________________________________________________


程序分析: 0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0

___________________________________________________________________


程序源代码:
#include "stdio.h"
main()
{
int a ,b;
a = 077;
b = a ^ 3;
printf( " /40 : The a & b(decimal) is %d /n " ,b);
b ^= 7;
printf( " /40 : The a & b(decimal) is %d /n " ,b);
}



题目:取一个整数 a 从右端开始的 4 7 位。

___________________________________________________________________


  程序分析:可以这样考虑:
( 1) 先使 a 右移 4 位。
( 2) 设置一个低 4 位全为 1 , 其余全为 0 的数。可用 ~( ~ 0 << 4)
( 3) 将上面二者进行 & 运算。

___________________________________________________________________


程序源代码:
main()
{
unsigned a ,b , c , d;
scanf( "%o" , & a);
b = a >> 4;
c =~( ~ 0 << 4);
d =b & c;
printf( "%o /n %o /n " , a , d);
}



题目:学习使用按位取反 ~ 。   

___________________________________________________________________


程序分析: ~ 0 = 1; ~ 1 = 0;

___________________________________________________________________


程序源代码:
#include "stdio.h"
main()
{
int a ,b;
a = 234;
b =~ a;
printf( " /40 : The a's 1 complement(decimal) is %d /n " ,b);
a =~ a;
printf( " /40 : The a's 1 complement(hexidecimal) is %x /n " , a);
}



题目:画图,学用 circle 画圆形。

___________________________________________________________________


程序源代码:
/*circle*/
#include "graphics.h"
main()
{
int driver , mode , i;
float j = 1 , k = 1;
driver = VGA; mode = VGAHI;
initgraph( & driver , & mode , "");
setbkcolor( YELLOW);
for( i = 0; i <= 25; i ++)
   {
   setcolor( 8);
   circle( 310 , 250 , k);
   k = k + j;
   j = j + 0.3;
   }
}



题目:画图,学用 line 画直线。

___________________________________________________________________

     
程序源代码:
#include "graphics.h"
main()
{
int driver , mode , i;
float x0 , y0 , y1 , x1;
float j = 12 , k;
driver = VGA; mode = VGAHI;
initgraph( & driver , & mode , "");
setbkcolor( GREEN);
x0 = 263; y0 = 263; y1 = 275; x1 = 275;
for( i = 0; i <= 18; i ++)
   {
   setcolor( 5);
   line( x0 , y0 , x0 , y1);
   x0 = x0 - 5;
   y0 = y0 - 5;
   x1 = x1 + 5;
   y1 = y1 + 5;
   j = j + 10;
   }
x0 = 263; y1 = 275; y0 = 263;
for( i = 0; i <= 20; i ++)
   {
   setcolor( 5);
   line( x0 , y0 , x0 , y1);
   x0 = x0 + 5;
   y0 = y0 + 5;
   y1 = y1 - 5;
   }
}



题目:画图,学用 rectangle 画方形。   

___________________________________________________________________

 
程序分析:利用 for 循环控制 100 - 999 个数,每个数分解出个位,十位,百位。

___________________________________________________________________

 
程序源代码:
#include "graphics.h"
main()
{
int x0 , y0 , y1 , x1 , driver , mode , i;
driver = VGA; mode = VGAHI;
initgraph( & driver , & mode , "");
setbkcolor( YELLOW);
x0 = 263; y0 = 263; y1 = 275; x1 = 275;
for( i = 0; i <= 18; i ++)
   {
   setcolor( 1);
   rectangle( x0 , y0 , x1 , y1);
   x0 = x0 - 5;
   y0 = y0 - 5;
   x1 = x1 + 5;
   y1 = y1 + 5;
   }
settextstyle( DEFAULT_FONT , HORIZ_DIR , 2);
outtextxy( 150 , 40 , "How beautiful it is!");
line( 130 , 60 , 480 , 60);
setcolor( 2);
circle( 269 , 269 , 137);
}
  • 1
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
算法设计与分析》目录: 第一篇引入篇 第1章算法概述1.1用计算机求解问题与算法 1.1.1用计算机求解问题的步骤 1.1.2算法及其要素和特性 1.1.3算法设计及基本方法 1.1.4从算法到实现 1.2算法描述 1.2.1算法描述简介 1.2.2算法描述约定 1.2.3一个简单问题的求解过程 1.3现代常用算法概览* 1.3.1压缩算法 1.3.2加密算法 1.3.3人工智能算法 1.3.4并行算法 1.3.5其他实用算法 第2章算法分析基础 2.1算法分析体系及计量 2.1.1算法分析的评价体系 2.1.2算法的时间复杂性 2.1.3算法的空间复杂性 2.1.4NP完全性问题 2.2算法分析实例 2.2.1非递归算法分析 2.2.2递归算法分析 2.2.3提高算法质量 第二篇基础篇 第3章算法基本工具和优化技巧3.1循环与递归 3.1.1循环设计要点 3.1.2递归设计要点 3.1.3循环与递归的比较 3.2算法与数据结构 3.2.1原始信息与处理结果的对应存储 3.2.2数组使信息有序化 3.2.3数组记录状态信息 3.2.4大整数存储及运算 3.2.5构造趣味矩阵 3.3优化算法的基本技巧 3.3.1算术运算的妙用 3.3.2标志量的妙用 3.3.3信息数字化 3.4优化算法的数学模型 3.4.1杨辉三角形的应用 3.4.2最大公约数的应用 3.4.3公倍数的应用 3.4.4斐波那契数列的应用 3.4.5递推关系求解方程 习题 第三篇核心篇 第4章基本的算法策略4.1迭代算法 4.1.1递推法 4.1.2倒推法 4.1.3迭代法解方程 4.2蛮力法 4.2.1枚举法 4.2.2其他范例 4.3分治算法 4.3.1分治算法框架 4.3.2二分法 4.3.3二分法变异 4.3.4其他分治方法 4.4贪婪算法 4.4.1可绝对贪婪问题 4.4.2相对或近似贪婪问题 4.4.3贪婪策略算法设计框架 4.5动态规划 4.5.1认识动态规划 4.5.2动态规划算法设计框架 4.5.3突出阶段性的动态规划应用 4.5.4突出递推的动态规划应用 4.6算法策略间的比较 4.6.1不同算法策略特点小结 4.6.2算法策略间的关联 4.6.3算法策略侧重的问题类型 习题 第5章图的搜索算法 5.1图搜索概述 5.1.1图及其术语 5.1.2图搜索及其术语 5.2广度优先搜索 5.2.1算法框架 5.2.2广度优先搜索的应用 5.3深度优先搜索 5.3.1算法框架 5.3.2深度优先搜索的应用 5.4回溯法 5.4.1认识回溯法 5.4.2回溯法算法框架 5.4.3应用1——基本的回溯搜索 5.4.4应用2——排列及排列树的回溯搜索 5.4.5应用3——最优化问题的回溯搜索 5.5分支限界法 5.5.1分支搜索算法 5.5.2分支限界搜索算法 5.5.3算法框架 5.6 图的搜索算法小结 习题 第四篇应用篇 第6章算法设计实践6.1循环赛日程表 6.2求3个数的最小公倍数 6.3猴子选大王 6.4最大子段和问题 6.5背包问题 6.5.1与利润无关的背包问题 6.5.2与利润有关的背包问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值