除法(/)和取余(%)的使用


除法(/)和取余(%)的使用

例 1:  求两个数的最大公约数gcd(a,b)和最小公倍数lcm(a,b)

思路1):

gcd(a,b)函数 :判断两个数中较小的数(假设 min = b), 定义一个变量tmp保存较小的那个值 :tmp = b并依次减一( tmp -= 1)(不能直接用b进行自减因为后面要判断b%tmp 是否等于零.若对b的值进行更改,则无法进行判断.),并判断tmp是否能被a,b整除,成立则返回tmp.

 lcm(a,b)函数 : 同理找出a,b中较大的(假设为a),定义一个变量tmp保存a(原理同上),通过依次加上tmp = tmp+a,判断(tmp%b == 0)是否从成立,成立则返回tmp, tmp 即为所求;

 代码:

int Gcd(int a, int b)
{
assert(a* b != 0); //若存在0 则退出程序且给出警告
int min = a < b ? a : b;
int tmp = 0;
for (int i = min; i > 0; i--)//(此处的i)
{
    if (a % i == 0 && b % i == 0)//若满足条件则说明此时i就是a,b的最大公约数.将i的值赋给tmp,并跳出循环.
    {
        tmp = i;
        break;
    }
}
return tmp;//返回最大公约数.
}
int Lcm(int a, int b)
{
    assert(a * b != 0);//对传递进函数的值进行判断.
    int max = a > b ? a : b;
    int tmp = max;
    while (tmp % a != 0 || tmp % b != 0) //当(tmp%a==0&&tmp%b==0)退出循环.
    {
        tmp = tmp + max;
    }
    return tmp;
}
int main()
{
    int a = 0, b = 0;
    printf("input two number: ");//输入两个数
    scanf_s("%d %d", &a, &b);
    int gcd = Gcd(a, b);
    int lcm = Lcm(a, b);
    printf("Gcd(%d,%d) = %d\nLcm(%d,%d) = %d", a, b, gcd, a, b, lcm);
    return 0;
}

 

 

运行结果:

思路2):

gcd(a,b):根据欧几里得定理(辗转相除法)(gcd(a,b) == gcd(b,a%b)) (即a,b的最大公约数,等于b,a%b 的最大公约数);

lcm(a,b):利用最大公约数进行求解,假设tmp为gcd(a,b),则a/tmp ==m , b/tmp==n ,则gcd(m,n)==1,于是可以得到lcm(a,b) == m*n*tmp

代码:

int Gcd(int a, int b)
{
    if (a == 0 || b == 0)//判断输入的值是否符合要求.
        return -1;
    while (a % b != 0)//
    {
        int tmp = a % b;
        a = b;
        b = tmp;
    }
    return b;
}
int Lcm(int a, int b)
{
    assert(a * b != 0);
    int tmp = 0;
    return tmp = a * b / Gcd(a, b);
}
int main()
{
    int a = 0, b = 0;
    printf("input two number: ");//输入两个数
    scanf_s("%d %d", &a, &b);
    int gcd = Gcd(a, b);
    int lcm = Lcm(a, b);
    printf("Gcd(%d,%d) = %d\nLcm(%d,%d) = %d", a, b, gcd, a, b, lcm);
    return 0;
}

 

运行结果:

例2:  将一个十进制整数(12345),正向打印和逆向打印.

分析:

1)正向打印:

 

 若知道该数字的位数m,我们可以用12345/pow(10,m-1) 就可以得到最高位的数字.因此第一步需要求该数的位数m,同时可以看出12345%pow(10,m-1)  = 2345,再通过上述方法就可以依次得到2,3,4,5

这样就可以进行正向打印.

现在关键在于求位数m,12345 每除以10一次(只保留整数部分),位数就会相应的减少一,因此可以通过循环求的该数的位数m.

求位数的代码如下:

int Digit(int num)
{
    assert(num > 0);//对传递进来的值进行判断.
    int sum = 0;//记录位数
    while (num / 10 != 0)
    {
        sum++;
        num = num / 10;
    }
    return num;//返回位数值
}

 

正向打印代码:

void Print_Forward(int num, int k)//传入数值以及该数值的位数
{
    assert(num > 0 && k > 1);
    int tmp = 0;//记录最高位的数值
    int k = 0;
    for (int i = k; i > 0; i++)
    {
        tmp = num / (pow(10, k - 1));//pow在math.h库函数中
        printf("%3d", tmp);
        k = (pow(10, k - 1));
        num = num % k;// 将最高位去掉
    }
}

 

2)逆向打印:

 

分析:

用12345对10取余(12345 % 10 = 5)即可得到个位数5 ,想要得到4,则需要1234对10进行取余运算.而想得到1234 可以利用12345对10做除法运算.因为(12345 / 10 = 1234).

代码如下:

void Print_order(int num)
{
    assert(num > 0);
    int tmp = 0;//记录数值
    while (num != 0)
    {
        tmp = num % 10;
        printf("%3d", tmp);
        num = num / 10;
    }
    printf("\n");//换行
}

 

主函数:

int main()
{
    int num = 12345;
    int k = Digit(num);
printf("位数:%d\n",k); Print_Forward(num, k); Print_order(num);
return 0; }

 

运行结果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM