【C】Practise1

来源:互联网 发布:爱丁堡 人工智能 编辑:程序博客网 时间:2024/05/04 14:10

【练手1】几个小习题

#include  <stdio.h>

#include  <math.h>

void main()

{

       void PrintScores();//functionsPrototype declarations

       void CalculateMultip();

       void LeapYear(unsigned,unsigned);

       void SequenceCal(int);

       void JudgePrimeNumber();

       void ComDivisorAndMultiple();

 

       CalculateMultip();//functions call

       PrintScores();

       LeapYear(2000, 2500);

       SequenceCal(10);

       JudgePrimeNumber();

       ComDivisorAndMultiple();

}

///////////////eg6.最大公约数与最小公倍数/////////////////////

倍数和约数:两个自然数ab,若a能被b整除,则a为倍数,b为约数

void ComDivisorAndMultiple()

{

       unsigned  m= 0, n = 0, M_Divisor, N_Divided, res = 0, MinMultiple =0;

       scanf("%d%d", &m, &n);

 

       if(m>0 && n>0)

       {

              if(m > n)

              {

                     M_Divisor      =     m;

                     N_Divided      =     n;    

              }

              else

              {

                     M_Divisor      =     n;

                     N_Divided      =     m;          

              }

              res   =     M_Divisor%N_Divided;

              while(res != 0)

              {

                     M_Divisor      =     N_Divided;

                     N_Divided      =     res;

                     res   =     M_Divisor%N_Divided; 

              }

              printf("The Max CommonDivisor is:%d\n", N_Divided);

              MinMultiple    =     (m * n)/N_Divided;

              printf("The Min CommonMultiple is:%d\n", MinMultiple);

       }

       else

              printf("Error!\n");

}

/////////////////////P17.eg5,判素数//////////////////////////

素数:1)只能被1和自身整除的数!2)判别范围2~sqrt(n)截止!

#define    PrimeNum      10

void JudgePrimeNumber()

{

       unsigned  i,j, PrimeNumber[PrimeNum], Flag = 0, PrimeJudge;

       for(i=0; i<PrimeNum; i++)

              scanf("%d",&PrimeNumber[i]);

       for(i=0; i<PrimeNum; i++)

       {

              /*///*for(j=2; j<10;j++)////////////////////////////        

              {

                     if(PrimeNumber[i]%j ==0)//1.判据错误!25.26.disabled

                            Flag++;   

              }

              if((2 == Flag) || (1 == Flag))

                     printf("ThePrimeNumber is:%d\n", PrimeNumber[i]); 

              else         

                     printf("The Otheris:%d***\n", PrimeNumber[i]);                     

              Flag =     1;///////////////////////////*/

 

              PrimeJudge     =     (unsigned)sqrt(PrimeNumber[i]);

              for(j=2; j<=PrimeJudge; j++)

              {

                     if(PrimeNumber[i]%j == 0)

                            Flag++;

              }

              if(Flag ||  (1==PrimeNumber[i]))

                     printf("The Otheris:%d***\n", PrimeNumber[i]);       

              else

                     printf("ThePrimeNumber is:%d\n", PrimeNumber[i]); 

              Flag =     0;

       }

}

 

/////////////////////P17.eg4,求和数列//////////////////////////

新手,易忽略的细节比较多啊~

void SequenceCal(int Count)

{

       int           i;     //2.Sum必须初始化,否则为乱码!

       float Sum= 0, Num;      //3.Sum, Num不能作为int

       for(i=1; i <= Count; i++)//1.i=0时会蹦出调试界面,提示遇到问题要关闭!因为0不能作分母!!!

       {

              Num = (float)(1.0/i);//0不能作分母!!!//4.不能写作(1/i,否则得到的是整数0

              if(i%2)    

                     Sum += Num;               

              else

                     Sum -= Num;                       

              printf("%f, %f\n", Num,Sum);

       }

/////////////////////P16.eg3,判断闰年//////////////////////////

1.能被4整除,但不能被100整除;

2.能被100整除,且能被400整除;

条件之一满足即可!

voidLeapYear(unsigned StartYear, unsigned EndYear)

{

       unsigned star, LeapYearNum = 0;

       for(star = StartYear; star <= EndYear;star++)

       {

              if(((0 == star%4) &&(star%100)) || (0 == star%400))

              {

                     printf("%d\n",star);

                     LeapYearNum ++;

              }

       }

       printf("********%d********\n",LeapYearNum);

}

 

//////////////////P15,eg2.打印80分以上的学生/////////////////

#define    STDNUM       5//define never has ";"

 

struct      student

{

       unsigned  Num;

       unsigned  Score;

       char        Name[20];

}std[STDNUM];

 

 

voidPrintScores()

{

       unsigned  i;

       for(i=0; i<STDNUM; i++)            

              scanf("%d,%d,%s",&std[i].Num, &std[i].Score, &std[i].Name);

       for(i=0; i<STDNUM; i++)     

              if(std[i].Score < 80)

                     printf("%d,%d,%s\n",std[i].Num, std[i].Score, std[i].Name);

 

}

///////////////P15,eg.1n的阶乘n!///////////////////

void  CalculateMultip()

{

       unsigned long  Sum, SumOdd, SumEven, i, Number;

       Sum =     SumOdd  =SumEven     =     1;

       scanf("%d", &Number);

       for(i=1; i<=Number; i++)

       {

              Sum *=   i;//n!

              printf("%d\n", Sum);

       }

       for(i=1; i<=Number; i++)

       {

              if(i%2)

              {

                     SumOdd  *=   i;

                     printf("%d***\n",SumOdd);//1*3*5*7*9...

              }

              else

              {

                     SumEven *=   i;

                     printf("%d\n",SumEven);//2*4*6*8*10...

              }

       }

}

 

说明:

输入两个正整数mn,求其最大公约数和最小公倍数

<1>辗转相除法求最大公约数

算法描述: mn求余为a, a不等于0 ;m <- n, n <- a, 继续求余 ;否则为最大公约数

<2>最小公倍数 = 两个数的积最大公约数

 

★ 关于辗转相除法搜了一下,在我国古代的《九章算术》中就有记载,现摘录如下

 

约分术曰:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 

 

其中所说的等数,就是最大公约数。求等数的办法是更相减损法,实际上就是辗转相除法。

 

辗转相除法求最大公约数,是一种比较好的方法,比较快。

 

<3>欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下:

先用小的一个数除大的一个数,得第一个余数;

再用第一个余数除小的一个数,得第二个余数;

又用第二个余数除第一个余数,得第三个余数;

这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互

质数)。

例如求1515600的最大公约数,

第一次:用6001515,商2315

第二次:用315600,商1285

第三次:用285315,商130

第四次:用30285,商915

第五次:用1530,商20

1515600的最大公约数是15

 

<4>两个正整数的最小公倍数=两个数的乘积÷两个数的最大公约数

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。这就是说,求两个数的最小公倍数,可以先求出两个数的最大公约数,再用这两个

数的最大公约数去除这两个数的积,所得的商就是两个数的最小公倍数。

 10542的最小公倍数。

因为10542的最大公约数是21

10542的积是44104410÷21210

所以,10542的最小公倍数是210

 

 

#include<math.h> 

int 

intabs(int x); 


 long 

longlabs(int x); 

 

浮点数 float double 

doublefabs(double x);