只要两个条件:
1、a != 0 //不等于0
2、a%b == 0 //能整除
int a, bscanf("%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
}
运行结果: