C语言 练手代码(6)

#include<stdio.h>


void Ex_value(int* a, int *b);
void Max_Com(void);     //最大公约数

void SN(void);                  //a+aa+aaa…

void Zero_Nub(void);            //数后的零个数

void Mul_table(void);           //九九乘法表

void Con_Sum(void);             //连续数之和

void Divide_Pri(void);          //分解质因数

void Perfect_Nub(void);         //1000以内完美数

int main()
{
 Max_Com();
 return 0;
}
/* * * * * * * * * * * * * * * * */
/* * * 函数名:Ex_value  * * * * */
/* * * 功能:  判断交换  * * * * */
/* * * * * * * * * * * * * * * * */
void Ex_value(int* a, int *b)
{
 if (*a < *b)
 {
  *a ^= *b;
  *b ^= *a;
  *a ^= *b;
 }
}

/* * * * * * * * * * * * * * * * */
/* * * 函数名:   Max_Com    * * */
/* * * 功能:   最大公约数  * * */
/* * * * * * * * * * * * * * * * */
void Max_Com(void)
{
 //方法一: 穷举法
 int high, low, com;
 printf("请输入两个正整数,例如:13 15\n");
 scanf("%d %d", &high, &low);
 /*
 com = high;
 for (; com > 0; com--)
 {
 if (!(high % com) && !(low % com))
 break;
 }
 printf("最大公约数为%d\n", com);
 */

 //方法二: 辗转相除法
 /*
 if (high < low)
 {
 Ex_value(&high, &low);
 }
 do
 {
 com = high % low;
 high = low;
 low = com;
 Ex_value(&high, &low);
 } while (low);
 printf("最大公约数为%d\n", high);
 */
 //方法三: 更相减损术
 if (high < low)
 {
  Ex_value(&high, &low);
 }
 do
 {
  if (high == low)
  {
   break;
  }
  com = high - low;
  high = low;
  low = com;
  Ex_value(&high, &low);
 } while (!(high == low));
 printf("最大公约数为%d\n", low);
}
/* * * * * * * * * * * * * * * * */
/* * * 函数名:   SN      * * */
/* * * 功能:    求和    * * */
/* * * * * * * * * * * * * * * * */
void SN(void)
{
 int nub, count, sum = 0, temp = 0;
 printf("请输入两个1——9的正整数,例如:3 5\n");
 scanf("%d %d", &nub, &count);
 sum = temp = count;
 for (; nub > 0; nub--, count *= 10, count += temp)
 {
  printf("%-5d", count);
  sum += count;
 }
 printf("\n%-5d\n", sum);
}
/* * * * * * * * * * * * * * * * */
/* * * 函数名: Zero_Nub     * * */
/* * * 功能:求末尾0的数目   * * */
/* * * * * * * * * * * * * * * * */
void Zero_Nub(void)
{
 int nub, temp, count = 0;
 printf("请输入一个正整数,例如:1000000\n");
 scanf("%d", &nub);
 if (nub)
 {
  temp = nub % 10;
  while (!temp)
  {
   count++;
   nub /= 10;
   temp = nub % 10;
  }
 }
 printf("这个数末尾有%d个0\n", count);
}

/* * * * * * * * * * * * * * * * */
/* * * 函数名: Mul_table    * * */
/* * * 功能:   九九乘法表   * * */
/* * * * * * * * * * * * * * * * */
void Mul_table(void)
{
 printf("打印九九乘法表\n");
 int h, r;
 h = r = 9;
 for (; h > 0; h--)
 {
  for (r = h; r > 0; r--)
   printf("%d * %d = %-8d", h, r, h*r);
  printf("\n");
 }
}

/* * * * * * * * * * * * * * * * */
/* * * 函数名:   Con_Sum    * * */
/* * * 功能:   连续数之和   * * */
/* * * * * * * * * * * * * * * * */
void Con_Sum(void)
{
 int nub, sum = 0, temp = 1, add = 1, flag = 0;
 /*
 temp , add决定从多少开始加 
 */
 printf("此函数用来求连续数,请输入一个数 :\n");
 scanf("%d", &nub);
 while (flag < 1000)
 {
  for (; sum < nub; temp++)
  {
   sum += temp;
  }
  if (sum == nub)
  {   
   printf("%-d = ", sum);
   int con = temp - 1;
   for (; con > flag + 1; con--)
   {
    printf("%-d +", con);
   }
   printf("%d\n", con);
   flag = 0;
   break;
  }
  else
  {
   temp = ++add;
   sum = 0;
   flag++;
  }
 }
}
/* * * * * * * * * * * * * * * * */
/* * * 函数名: Divide_Pri   * * */
/* * * 功能:   分解质因数   * * */
/* * * * * * * * * * * * * * * * */
void Divide_Pri(void)
{
 printf("分解质因数,请输入一个大于2的正整数\n");
 int pri_arr[25], mark = 0;
 int data = 2, com = 2;
 int nub, flag1, flag2;
 /*
 data  数据集 从中筛选质数
 com   用来比较的数
 判断质因数
 nub : 用户输入的数
 flag1:用于暂存除法后的值
 flag2:用于暂存求余后的值
 */
 for (; data <= 100; data++)
 {
  for (com = 2; com < data / 2 + 1; com++)
  {
   if (!(data % com))
   {
    break;
   }
  }
  if (com >= data / 2 + 1)
  {
   pri_arr[mark] = data;
   mark++;
  }
 }
 mark = 0;
 
 //以上 将100 以内的质数存入 数组  此时mark = 0
 
 scanf("%d", &nub);
 printf("%d = ", nub);
 while (mark < 25)
 {
  flag1 = nub / pri_arr[mark];
  flag2 = nub % pri_arr[mark];  
  if (flag1 != 1&& !flag2)
  {
   printf("%d * ", pri_arr[mark]);
   nub = flag1;
  }
  else if (flag1 = 1 && !flag2)
  {
   printf("%d\n", pri_arr[mark]);
   mark = 0;
   break;
  }
  else
   mark++;
 }
}

/* * * * * * * * * * * * * * * * */
/* * * 函数名: Perfect_Nub  * * */
/* * * 功能:求1000以内的完数* * */
/* * * * * * * * * * * * * * * * */
void Perfect_Nub(void)
{
 int nub = 2, sum = 0;
 int dividend;
 /*
  nub   源数据
  sum   因数和
  dividend 被除数
  temp  用来暂存源数据
 */
 printf("1000以内完美数:\n");
 for (; nub <= 1000; nub++)  //源数据
 {
  for (sum = 0, dividend = 1; dividend < nub; dividend++)   //被除数
  {
   if (!(nub % dividend))
   {
    sum += dividend;
   }
  }
  if (sum == nub)
   printf("%d\t", nub);
 }
 printf("\n\n");
}












猜你喜欢

转载自blog.csdn.net/weixin_42510998/article/details/81015185