color:rgb(85,0,255); font-family:宋体">【练手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();
}
color:rgb(255,0,127)">///eg6.color:rgb(255,0,127); font-family:宋体">最大公约数与最小公倍数color:rgb(255,0,127)">/
倍数和约数:两个自然数ac;bc;若a能被b整除c;则a为倍数c;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");
}
color:rgb(255,0,127)">/P17.eg5,color:rgb(255,0,127); font-family:宋体">判素数color:rgb(255,0,127)">//
素数: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;
}
}
color:rgb(255,0,127)">/P17.eg4,color:rgb(255,0,127); font-family:宋体">求和数列color:rgb(255,0,127)">//
新手c;易忽略的细节比较多啊~
void SequenceCal(int Count)
{
int i; //2.Sum必须初始化c;否则为乱码!
float Sum= 0, Num; //3.Sum, Num不能作为int型
for(i=1; i <= Count; i++)//1.当i=0时会蹦出调试界面c;提示遇到问题要关闭!因为0不能作分母!!!
{
Num = (float)(1.0/i);//0不能作分母!!!//4.不能写作(1/ic;否则得到的是整数0)
if(i%2)
Sum += Num;
else
Sum -= Num;
printf("%f, %f\n", Num,Sum);
}
}
color:rgb(255,0,127)">/P16.eg3,color:rgb(255,0,127); font-family:宋体">判断闰年color:rgb(255,0,127)">//
1.能被4整除c;但不能被100整除;
2.能被100整除c;且能被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);
}
color:rgb(255,0,127)">//P15,eg2.color:rgb(255,0,127); font-family:宋体">打印color:rgb(255,0,127)">80color:rgb(255,0,127); font-family:宋体">分以上的学生color:rgb(255,0,127)">/
#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);
}
color:rgb(255,0,127)">///P15,eg.1color:rgb(255,0,127); font-family:宋体">【color:rgb(255,0,127)">ncolor:rgb(255,0,127); font-family:宋体">的阶乘color:rgb(255,0,127)">n!color:rgb(255,0,127); font-family:宋体">】color:rgb(255,0,127)">///
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...】
}
}
}
说明:
输入两个正整数m和n,求其最大公约数和最小公倍数.
<1>用color:rgb(255,0,0); font-family:宋体">辗转相除法求最大公约数
算法描述: m对n求余为a, 若a不等于0 ;则m <- n, n <- a, 继续求余 ;否则n 为最大公约数;
<2>最小公倍数 = 两个数的积/ 最大公约数
★ 关于辗转相除法, 搜了一下,在我国古代的《九章算术》中就有记载c;现摘录如下:
约分术曰:“可半者半之c;不可半者c;副置分母、子之数c;以少减多c;更相减损c;求其等也。以等数约之。”
其中所说的“等数”c;就是最大公约数。求“等数”的办法是“更相减损”法c;实际上就是辗转相除法。
辗转相除法求最大公约数c;是一种比较好的方法c;比较快。
<3>用color:rgb(255,0,0); font-family:宋体">欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下:
先用小的一个数除大的一个数c;得第一个余数;
再用第一个余数除小的一个数c;得第二个余数;
又用第二个余数除第一个余数c;得第三个余数;
这样逐次用后一个数去除前一个余数c;直到余数是0为止。那么c;最后一个除数就是所求的最大公约数(如果最后的除数是1c;那么原来的两个数是互
质数)。
例如求1515和600的最大公约数c;
第一次:用600除1515c;商2余315;
第二次:用315除600c;商1余285;
第三次:用285除315c;商1余30;
第四次:用30除285c;商9余15;
第五次:用15除30c;商2余0。
1515和600的最大公约数是15。
<4>两个正整数的最小公倍数=两个数的乘积÷两个数的最大公约数
由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。这就是说c;求两个数的最小公倍数c;可以先求出两个数的最大公约数c;再用这两个
数的最大公约数去除这两个数的积c;所得的商就是两个数的最小公倍数。
例 求105和42的最小公倍数。
因为105和42的最大公约数是21c;
105和42的积是4410c;4410÷21=210c;
所以c;105和42的最小公倍数是210。
#include<math.h>
int 型
intabs(int x);
long 型
longlabs(int x);
浮点数 float double
doublefabs(double x);