当前位置: 代码迷 >> C语言 >> 一个编程题目,求解题思路,不要求过程,当然有过程更好,望各位高手不吝赐教!
  详细解决方案

一个编程题目,求解题思路,不要求过程,当然有过程更好,望各位高手不吝赐教!

热度:142   发布时间:2008-05-12 05:01:41.0
广陵兄,任何事情要认真分析以后才下结论。这道题其实很简单的。
根据LZ的叙述,我们可以得出式子,其中n是m的位数。m是所求的数字。
p*10^n+m
---------=q
m*10+p
这个式子,p,q已知,n可以根据m算出来。似乎已经解决了:枚举m即可。但是从飞燕的结果来看,枚举m显然是不行的。因为位数太多。这时我们可以反其道而求之。我们先假设n已知,把m解出来:
p*10^n+m=10qm+pq
p*10^n=(10q-1)m+qp
m=(10^n-q)p/(10q-1)

这样,我们直接枚举n,然后就可以针对每个n求出一个m。但是除法不一定是整除。那么问题转变为:求最小的n,使上式得出的m为整数。同时m的位数为n。
枚举n的话,问题的复杂度就可以大大降低了。
这道题还需要大数运算的知识,大数除法,整除判断等我还没做过。查完了资料再来看这道题。
----------------解决方案--------------------------------------------------------
飞燕真的很强,一个小时可以写出算法并算出结果。要是我肯定做不到……基础啊………………欠缺基础……
----------------解决方案--------------------------------------------------------
额……百度到两种大数除法的方法,一种是模拟手算,还有一种是用减法和移位实现……想想再说……
----------------解决方案--------------------------------------------------------
楼上,你说的方法不好,还不是我所用的方法
还有,假如尾数不一定是一个位,比如是10,要是6的倍数,
那么结果是:
01669449081803005008347245409015025041736227045075125208681135225375626043405676126878130217028380634390651085141903171953255425709515859766277128547579298831385642737896494156928213689482470784641068447412353923205342237061769616026711185308848080133555926544240400667779632721202003338898163606010
(最高位的0必须要保留。。。)

[color=white]
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]hjh10845[/un] 在 2008-5-12 00:03 的发言:[/bo]

for(a[10]=0;a[10]


a[10]是变量 怎么会是常数呢?
----------------解决方案--------------------------------------------------------
貌似不用那么复杂,我就说LZ的原始数据
最后一位(尾数)是4,并且把4挪走了以后新数变成原来的4倍,4*4=16,那么新数的个位必定是6还要往高位进一,也就是说原数的十位是6。然后6*4=24,那么新数十位(原数百位)就是24的那个4再加上刚才从后边进上来的1,也就是5,再往更高位进2(24的十位)......

往前递推就可以了。
我这么说不知道说清楚了没有?
假设p,q都是1位数:
程序代码:
#include <stdio.h>
int main()
{
    int a[1000]={0};
    int p,q,jin,i;
    scanf("%d%d",&p,&q);
    a[0]=p;
    i=1;
    while(1)
    {
        jin=a[i-1]*q;
        if(p==a[i]+jin)
        {
            i--;
            break;
        }
        a[i]+=jin%10;
        a[i+1]+=jin/10;
        i++;
    }
    while(--i+1)
        printf("%1d",a[i]);
    printf("\n");
    return 0;
}


[[it] 本帖最后由 forever74 于 2008-5-12 12:24 编辑 [/it]]
本帖最近评分记录
  • StarWing83 +3 啊……我想复杂了…… 2008-5-12 12:50
2008-05-12 03:12:18
StarWing83

来 自:湖北工业大学
等 级:贵宾
威 望:19
帖 子:3946
专家分:748
注 册:2007-11-16
  得分:0 
恩……递推复杂度的确比枚举低……Orz……
话说,枚举也不高吧?假设答案是m位,枚举也只需要枚举m次而已,每次一次减法,一次乘法,一次除法……
而且并不需要强制规定p是一位,可以稍微改改公式就够了。
前面的0我的方法也可以解决,如果n和m位数不同的话,前补0.
----------------解决方案--------------------------------------------------------
啊……递推其实不需要用到大数运算……Orz……我错了……
----------------解决方案--------------------------------------------------------
16楼的代码要是输入 06896551724137931  2 呢?
注意最高位为0的情况(这时是有用的,占位)

[color=white]
----------------解决方案--------------------------------------------------------
飞燕,我的5 5的运行结果是:
10204081632653061224489795918367305
经验算也是正确的,但是比你的小……
----------------解决方案--------------------------------------------------------