乘法问题——乘法口诀表,分解因数,求最大公约数

分解因数问题
基本思路——给定一个数k,让其除以所有小于等于他的数,如果可以除尽,及if(k%i==0)为真,那么k就是他的一个因数,那么所得商的因数一定是k的因数所以

 if (k % i == 0)
		 {
    
    
			 printf("因素是%d\n", i);
			 j++;
			 
			 k = k / i;

			 i = 1;
		
		 }

这时候的k就是原来k/i的商 k的商的因数也是k的因数
接下来我们需要构建一个循环产生所有小于等于k的数

 for (i = 1; i <= k; i++)
	 {
    
    
		 if (k % i == 0)
		 {
    
    
			 printf("因素是%d\n", i);
			 j++;
			 
			 k = k / i;

			 i = 1;
		
		 }
	 
	 }
	

同时 我们需要通过变量j来判断k是不是为质素 反馈给我们 当k%i==0 有且只有两次为真 k和1时 我们判断为质数 附上代码全文

 resolve()
 {
    
    
	 int a = 0;
	 int j = 0;
	 int i = 0;
	 int k = 0;
	 printf("你要求谁的因素?");
	 scanf("%d", &k);
	 a = k;
	 for (i = 1; i <= k; i++)
	 {
    
    
		 if (k % i == 0)
		 {
    
    
			 printf("因素是%d\n", i);
			 j++;
			 
			 k = k / i;

			 i = 1;
		
		 }
	 
	 }
	 if (j == 2)
	 {
    
    
		 printf("****%d是质素****", a);
	 }
		 
	 
	 
	

	 

	 
 }

求最大公约数 老祖宗的更相减损术
更相减损术的第一步就是判断两个数得最大公约数是否为2
我们只需要将for循环入口设置为**for (; i % 2 == 0&&j%2==0;)**只要要求的两个数 i j 均可以同时整除2就可以进入循环 我们还要增加一个变量m 确定除了几次2 在后续补上

for (; i % 2 == 0&&j%2==0;)
	 {
    
    
		 i = i/2;
		 j = j / 2;
		 m++;
	 }

当我们输入 i j 变量时 第二步就需要判断 i j 谁大 为了方便 我们将i变量设置为较大变量 通过简单的变量转换

if (j > i)
	 {
    
    
		 a = i;
		 i = j;
		 j = a;
	 }

在这里插入图片描述
从本例可以看出 就是先用输入的较大变量i减去较小变量j得到的差 然后差在和减数比较 较大的做被减数 小的做减数 直到减数和差相等
可见 循环的出口就是减数和差相等。
设计思路 先相减在将 减数和差的较大值附给i

for (;;)
	 {
    
    
		 b = i - j;
		 
		
		 if (j == b)
		 {
    
    
			 break; 
		 }
		 if (b > j)
		 {
    
    
			 a = j;
			 j = b;
			 b = a;
		 }
		 i = j;
		 j = b;

     }

最后如果m变量大于0那么因数就要乘以2的m倍 反之直接输出

if (m > 0)
	 {
    
    
		 n = 2 * m * b;
		 printf("最大公约数是%d", n);
      }
	 else
		 printf("最大公约数是%d", j);

附上整个

common()
 {
    
    
	 int a = 0;
	 int n = 0;
	 int m = 0;
	 int i = 0;
	 int j = 0; 
	 printf("请输入被求数\n");
	 scanf("%d %d", &i, &j);
	 for (; i % 2 == 0&&j%2==0;)
	 {
    
    
		 i = i/2;
		 j = j / 2;
		 m++;
	 }
	 if (j > i)
	 {
    
    
		 a = i;
		 i = j;
		 j = a;
	 }
	 a = 0;
	 int b = 0;
	 for (; ; )
	 {
    
    
		 b = i - j;
		 
		
		 if (j == b)
		 {
    
    
			 break;
		 }
		 if (b > j)
		 {
    
    
			 a = j;
			 j = b;
			 b = a;
		 }
		 i = j;
		 j = b;

     }
	 if (m > 0)
	 {
    
    
		 n = 2 * m * b;
		 printf("最大公约数是%d", n);
      }
	 else
		 printf("最大公约数是%d", j);
 }

第三个功能 打印 乘法口诀表
我们需要i j 两个变量 控制行列 第一行的终点是1,1 第二行的终点是2,2
可见 终点列变量时受行控制的 那么内层循环入口就是j<=i

for (j = 1; j <= i; j++)
		{
    
    
			k = i * j;
			printf("%d = %d * %d   ",k,i,j);
			k = 0;
		}

当行控制了 那么列也就确定了 乘法口诀表一共9行 所以只需要让i小于等于9即可

 table()
{
    
    
	 int i = 0;
	 int j = 0;
	int k = 0;
	for (i = 1; i <= 9; i++)
	{
    
    
		j = 0;
		for (j = 1; j <= i; j++)
		{
    
    
			k = i * j;
			printf("%d = %d * %d   ",k,i,j);
			k = 0;
		}
		printf("\n");
	}
	
}

这里附上 test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"实现.h"
int main()
{
    
    
	int input = 0;
	menu();
	scanf("%d", &input);
	chose(input);
	
	
	
	return 0;
}

头文件 实现.h

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS 1


menu();
void chose(int input);
table();
resolve();
common();

实现文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"实现.h"

menu()
{
    
    
	printf("*******1,分解因数**************\n");
	printf("*******2,求两个数最大公约数****\n");
	printf("*******3,打印口诀表************\n");
	printf("*******4,退出**************\n");
}

 table()
{
    
    
	 int i = 0;
	 int j = 0;
	int k = 0;
	for (i = 1; i <= 9; i++)
	{
    
    
		j = 0;
		for (j = 1; j <= i; j++)
		{
    
    
			k = i * j;
			printf("%d = %d * %d   ",k,i,j);
			k = 0;
		}
		printf("\n");
	}
	
}
 void chose(int input)
 {
    
    
	 do
	 {
    
    
		 switch (input)
		 {
    
    
		 case 1:
			 resolve();

			 break;
		 case 2:
			 common();
			 break;
		 case 3:

			 table();
			 break;
		 default:
			 break;
		 }

	 } while (input!=3);
	 

	 
 }
 resolve()
 {
    
    
	 int a = 0;
	 int j = 0;
	 int i = 0;
	 int k = 0;
	 printf("你要求谁的因素?");
	 scanf("%d", &k);
	 a = k;
	 for (i = 1; i <= k; i++)
	 {
    
    
		 if (k % i == 0)
		 {
    
    
			 printf("因素是%d\n", i);
			 j++;
			 
			 k = k / i;

			 i = 1;
		
		 }
	 
	 }
	 if (j == 2)
	 {
    
    
		 printf("****%d是质素****", a);
	 }
		 
	 
	 
	

	 

	 
 }
 common()
 {
    
    
	 int a = 0;
	 int n = 0;
	 int m = 0;
	 int i = 0;
	 int j = 0; 
	 printf("请输入被求数\n");
	 scanf("%d %d", &i, &j);
	 for (; i % 2 == 0&&j%2==0;)
	 {
    
    
		 i = i/2;
		 j = j / 2;
		 m++;
	 }
	 if (j > i)
	 {
    
    
		 a = i;
		 i = j;
		 j = a;
	 }
	 a = 0;
	 int b = 0;
	 for (;;)
	 {
    
    
		 b = i - j;
		 
		
		 if (j == b)
		 {
    
    
			 break;
		 }
		 if (b > j)
		 {
    
    
			 a = j;
			 j = b;
			 b = a;
		 }
		 i = j;
		 j = b;

     }
	 if (m > 0)
	 {
    
    
		 n = 2 * m * b;
		 printf("最大公约数是%d", n);
      }
	 else
		 printf("最大公约数是%d", j);
 }

猜你喜欢

转载自blog.csdn.net/qq_45849625/article/details/110264273