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

除法(/)和取餘(%)的使用git

例 1:  求兩個數的最大公約數gcd(a,b)和最小公倍數lcm(a,b)函數

思路1):spa

gcd(a,b)函數 :判斷兩個數中較小的數(假設 min = b), 定義一個變量tmp保存較小的那個值 :tmp = b並依次減一( tmp -= 1)(不能直接用b進行自減由於後面要判斷b%tmp 是否等於零.若對b的值進行更改,則沒法進行判斷.),並判斷tmp是否能被a,b整除,成立則返回tmp.3d

 lcm(a,b)函數 : 同理找出a,b中較大的(假設爲a),定義一個變量tmp保存a(原理同上),經過依次加上tmp = tmp+a,判斷(tmp%b == 0)是否從成立,成立則返回tmp, tmp 即爲所求;code

 代碼:blog

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;
}

 

 

運行結果:input

思路2):it

gcd(a,b):根據歐幾里得定理(展轉相除法)(gcd(a,b) == gcd(b,a%b)) (即a,b的最大公約數,等於b,a%b 的最大公約數);class

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; }

 

運行結果:

相關文章
相關標籤/搜索