C语言编程:X倍数问题
若一个整数Y的个位数为X,将X移到最高位得到的恰好是Y的X倍,称Y为一个X倍数。例如,0是一个0倍数,1是一个1倍数。请依次输出最小的0倍数、1倍数、2倍数、……9倍数。...
若一个整数Y的个位数为X,将X移到最高位得到的恰好是Y的X倍,称Y为一个X倍数。例如,0是一个0倍数,1是一个1倍数。
请依次输出最小的0倍数、1倍数、2倍数、……9倍数。每个X倍数输出一行。
提示:即使是最小的X倍数也可能是一个非常大的整数,甚至远远超出int所能表达的范围。
求C语言代码
并讲解一下是怎么做的 展开
请依次输出最小的0倍数、1倍数、2倍数、……9倍数。每个X倍数输出一行。
提示:即使是最小的X倍数也可能是一个非常大的整数,甚至远远超出int所能表达的范围。
求C语言代码
并讲解一下是怎么做的 展开
4个回答
展开全部
思路:无需搜索,直接可推出最小数字
以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;
}
运行结果:
展开全部
学一下高精度乘法。
从小到大对每个自然数尝试是否是X倍数(X=0, 1, ..., 9),直到找出所有倍数为止。
从小到大对每个自然数尝试是否是X倍数(X=0, 1, ..., 9),直到找出所有倍数为止。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
题目含义不清楚,比如123你告诉我要怎么移
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
132321312312312312312312
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询