分解因数问题
基本思路——给定一个数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);
}