c语言求倍数

Python059

c语言求倍数,第1张

只要两个条件:

1、a != 0           //不等于0

2、a%b == 0      //能整除

int a, b

scanf("%d%d", &a, &b)

if ((a != 0) && (a%b == 0))

    return 1;//则是倍数

程序的健壮性不够强。你没有考虑到除0的情况:

如果a是0,那么直接就可以输出1了;

如果a不为0,但b是0,那么直接输出0了

思路:无需搜索,直接可推出最小数字

以2为例

设原数a为xxxx...xxxxx2

那么新数b为2xxx...xxxx

其中:b = 2 * a,b / a = 2,则a的第一位必须为1;同样的道理,b的最后一位必须为4,则有:

a = 1xxx.....xxxxx42

b = 21xx.....xxxxxx4

继续可以推得,b的倒数第二位(a的倒数第三位)必须为8,此时:

a = 1xxx.....xxxx842

b = 21xx.....xxxxx84

依次类推,下一位必须为8*2 = 16,其中进位必须进到下一位:

a = 1xxx......xxx6842

b = 21xx......xxxx684

a = 1xxx......xx36842

b = 21xx......xxx3684

以此类推,可以由a的最后一位不断推出下一位,而终止条件为推出的下一位是进位所得的1(否则就不是最小了)。

上述推论对2-9都可成立,那么代码如下:

#include <stdio.h>

#include <string.h>

//由于所求数将会超出int,因此以char[]表示;第二个参数为所求倍数

void getNumber(char* number,int mult)

{

    char* curDigit = number //由于无法预先得知结果位数,因此将最后一位放在数列首位,获得结果后倒置

    int temp //临时变量用来储存计算得出的下一位

    int carry //进位

    *curDigit = mult + '0' //从最后一位开始;加上ascii偏移

    carry = 0

    while(!(*curDigit == '0' && carry == 1)) //终止条件

    {

        temp = (*curDigit - '0') * mult + carry //下一位数=当前位数*倍数+进位

        if(temp > 9)

        {

            *(curDigit + 1) = temp % 10 + '0' 

            carry = temp / 10 //计算结果大于9时保留个位数计入下一位,并进位

        }

        else

        {

            *(curDigit + 1) = temp + '0'

            carry = 0

        }

        curDigit++

    }

    *++curDigit = '1' //循环结束后加上最后一位1

    *++curDigit = '\0' //字符串终止

    _strrev(number) //反转当前字符串获得结果

}

int main(int argc, char* argv[])

{

    char result[300]

    result[0] = '\0'

    int i = 2

    for(i i <= 9 i++)

    {

        getNumber(result, i)

        printf("The number for %d is: %s\n", i, result)

    }

    return 0

}

运行结果: