| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3602 人关注过本帖, 2 人收藏
标题:一个编程题目,求解题思路,不要求过程,当然有过程更好,望各位高手不吝赐教!
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分: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的话,问题的复杂度就可以大大降低了。
这道题还需要大数运算的知识,大数除法,整除判断等我还没做过。查完了资料再来看这道题。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-12 05:01
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
飞燕真的很强,一个小时可以写出算法并算出结果。要是我肯定做不到……基础啊………………欠缺基础……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-12 05:04
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
额……百度到两种大数除法的方法,一种是模拟手算,还有一种是用减法和移位实现……想想再说……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-12 05:18
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
楼上,你说的方法不好,还不是我所用的方法
还有,假如尾数不一定是一个位,比如是10,要是6的倍数,
那么结果是:
01669449081803005008347245409015025041736227045075125208681135225375626043405676126878130217028380634390651085141903171953255425709515859766277128547579298831385642737896494156928213689482470784641068447412353923205342237061769616026711185308848080133555926544240400667779632721202003338898163606010
(最高位的0必须要保留。。。)

[color=white]
2008-05-12 10:09
juisi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-5-12
收藏
得分:0 
[bo]以下是引用 [un]hjh10845[/un] 在 2008-5-12 00:03 的发言:[/bo]

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


a[10]是变量 怎么会是常数呢?
2008-05-12 10:44
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1686
专家分:4252
注 册:2007-12-27
收藏
得分:0 
貌似不用那么复杂,我就说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]]
收到的鲜花
  • StarWing832008-05-12 12:50 送鲜花  3朵   附言:啊……我想复杂了……
2008-05-12 11:12
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
恩……递推复杂度的确比枚举低……Orz……
话说,枚举也不高吧?假设答案是m位,枚举也只需要枚举m次而已,每次一次减法,一次乘法,一次除法……
而且并不需要强制规定p是一位,可以稍微改改公式就够了。
前面的0我的方法也可以解决,如果n和m位数不同的话,前补0.

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-12 12:52
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
啊……递推其实不需要用到大数运算……Orz……我错了……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-12 12:59
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
16楼的代码要是输入 06896551724137931  2 呢?
注意最高位为0的情况(这时是有用的,占位)

[color=white]
2008-05-12 13:41
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
飞燕,我的5 5的运行结果是:
10204081632653061224489795918367305
经验算也是正确的,但是比你的小……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-12 13:49
快速回复:一个编程题目,求解题思路,不要求过程,当然有过程更好,望各位高手不吝赐 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021407 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved