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语言代码
并讲解一下是怎么做的
展开
 我来答
百度网友fe016f1
2014-07-12 · TA获得超过802个赞
知道小有建树答主
回答量:467
采纳率:77%
帮助的人:305万
展开全部

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

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

 

运行结果:

ry_x
2014-07-12 · TA获得超过941个赞
知道小有建树答主
回答量:1095
采纳率:0%
帮助的人:734万
展开全部
学一下高精度乘法。
从小到大对每个自然数尝试是否是X倍数(X=0, 1, ..., 9),直到找出所有倍数为止。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
plzaq1
2014-07-11 · TA获得超过206个赞
知道小有建树答主
回答量:336
采纳率:0%
帮助的人:119万
展开全部
题目含义不清楚,比如123你告诉我要怎么移
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rhdlilj
2014-07-11 · TA获得超过160个赞
知道小有建树答主
回答量:194
采纳率:55%
帮助的人:97.2万
展开全部
132321312312312312312312
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式