楼主: 〇〇

[转载] Project Euler解题汇总(更新至309在1楼)

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
81#
 楼主| 发表于 2010-11-9 09:46 | 只看该作者
Problem 302
18 September 2010


A positive integer n is powerful if p2 is a divisor of n for every prime factor p in n.

A positive integer n is a perfect power if n can be expressed as a power of another positive integer.

A positive integer n is an Achilles number if n is powerful but not a perfect power. For example, 864 and 1800 are Achilles numbers: 864 = 25·33 and 1800 = 23·32·52.

We shall call a positive integer S a Strong Achilles number if both S and φ(S) are Achilles numbers.1
For example, 864 is a Strong Achilles number: φ(864) = 288 = 25·32. However, 1800 isn't a Strong Achilles number because: φ(1800) = 480 = 25·31·51.

There are 7 Strong Achilles numbers below 104 and 656 below 108.

How many Strong Achilles numbers are there below 1018?

1 φ denotes Euler's totient function.

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
82#
 楼主| 发表于 2010-11-9 10:49 | 只看该作者
Euler's totient function 欧拉函数及其应用2008-11-02 20:08欧拉函数的定义:E(n)=([1,n-1]中与n互质的整数个数).因为任意正整数都可以唯一表示成如下形式:
k=p1^a1*p2^a2*……*pi^ai;(即分解质因数形式)
可以推出:E(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))
               =k*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);
               =k*(1-1/p1)*(1-1/p2)....(1-1/pk)

在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因素)
若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);

应用如下例:

Farey Sequence

Time Limit: 1000MS

Description

The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are
F2 = {1/2}
F3 = {1/3, 1/2, 2/3}
F4 = {1/4, 1/3, 1/2, 2/3, 3/4}
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}

You task is to calculate the number of terms in the Farey sequence Fn.

Input

There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are no blank lines between cases. A line with a single 0 terminates the input.

Output

For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn.

Sample Input
2
3
4
5
0
Sample Output
1
3
5
9

    题目意思就是计算小于或等于n的互质的对数,2 <= n <= 106,观察n的范围,如果用欧拉函数的话肯定会超时,这是要利用欧拉函数的性质了:

若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);

这样在打出素数表后就可以直接计算每个数的的欧拉值了,最后累加起来就是小于或等于n的互质的对数了。核心代码如下,

void Prime2()
{
    int num = 0, i, j, k;
    for(i = 2; i < N; ++i)
    {
        if(!(a[i])) p[num++] = i;
        for(j = 0; (j<num && i*p[j]<N); ++j)
        {
            k=i*p[j];
            a[k] = 1;
            factor[k]=p[j];   // 记录k的最小质因子
            if(!(i%p[j])) break;
        }
    }
}
void phi()
{
       int i, div;
       for(i=2; i<N; i++)
       {
              if(a[i]==0)
                     f[i]=i-1;
              else
              {
                     div=i/factor[i];
                     if(div % factor[i]==0)
                            f[i]=f[div]*factor[i];
                     else
                            f[i]=f[div]*(factor[i]-1);
              }
       }
       for(i=3; i<N; i++)
              f[i]+=f[i-1];                 
}

其实这两个函数可以直接合并在一个函数里,下面是ac这道题的代码:

#include<cstdio>
#define N 1000001

bool a[N]={0};
int p[78498];
long long f[N];

void Prime_PHI()
{
    int num = 0, i, j, k;
    for(i = 2; i < N; ++i)
    {
        if(!(a[i]))
              {
                     p[num++] = i;
                     f[i]=i-1;
              }   
        for(j = 0; (j<num && (k=i*p[j])<N ); ++j)
        {
            a[k] = 1;
            if(i%p[j]==0)
            {
                   f[k]=f[i]*p[j];
                   break;
                     }
            else
                   f[k]=f[i]*(p[j]-1);
        }
    }
    for(i=3; i<N; i++)
              f[i]+=f[i-1];   
}

int main()
{
       Prime_PHI();

       int n;            
       while(scanf("%d",&n),n)
       {
              printf("%I64d\n", f[n]);
       }           
}

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
83#
发表于 2010-11-9 23:14 | 只看该作者
179 Consecutive positive divisors  
连续的正因子

Find the number of integers 1 < n < 10^7, for which n and n + 1 have the same number of positive divisors. For example, 14 has the positive divisors 1, 2, 7, 14 while 15 has 1, 3, 5, 15.

假定1<n<10^7,n和n+1具有相同的因子数,请问总共有多少个n满足条件?
举例:14有1、2、7、14四个因子,而15也有四个因子,即:1、3、5、15。故n=14是满足题设的一个数。

————————————————————————————————————————————————————————
决定做这题了,大致思路如下:
1、建立4000以内的质数表
2、因为连续两个数字除了2、3之外,如果有一个为质数,那另外一个必然为偶数,从而他们不会具有相同数目的因子,因此我们只需要考虑两个质数之间的合数就行
3、将2~10^7-1插入一张表,表中还有字段fn记录该数的因数个数,默认值为0。
4、更新fn的值为其因子数目
5、lag/lead函数显威

很明显的sql思路,会造成大量的重复计算,会产生很高的IO,所以改进如下:
1、创建质数数组prime[4000],临时因子数组tf[20],变量currFN,prevFN分别记录当前数的因子个数和前一个数的因子个数,默认值均为0
     变量 all_scfn记录有几个数字满足题设条件
2、从2~10^7-1循环
   将循环数n与prime中已有的不超过sqrt(n)的数相除,找到第一个能除尽的数prime[y],则tf[1]=prime[y],然后继续从prime[y]开始找寻(n/prime[y])的质因数,依次记录入tf[]中。
       然后根据tf中质因子个数,计算其不同的因子的个数。例如,假设tf中有3个a、4个b、1个c、一个d、2个e,则其不同因子的个数的计算公式为:
             3×4×2×5!
          记录入currFN中,并与prevFN做比较,相等则all_scfn++。之后将currFN存入prevFN中
   如果找遍了不超过sqrt(n)的prime[],还是没法找到质因数因子,则将该数存入质数数组prime中

3、循环结束,打印all_scfn即为结果

[ 本帖最后由 lastwinner 于 2010-11-9 23:20 编辑 ]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
84#
发表于 2010-11-9 23:31 | 只看该作者
原帖由 newkid 于 10-11-9 04:23 发表
辗转相除法求最小公倍数:费了半天劲才调试完,用SQL写此类算法真是自虐。


sql还是干他擅长的事情比较好
我也不想用sql自虐了,没意思,效率还贼低

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
85#
发表于 2010-11-10 01:03 | 只看该作者
原帖由 〇〇 于 2010-11-9 08:15 发表

确实是bug,我再看看
是最后打印的循环上标差1

/*
设计思路:
如果一个数是有限小数,那么余数乘以10的n次方,总有能整除的。
比如1/8,第1步1/8余数1,第2步10/8余数2,第3步20/8余数4,第4步40/8余数0
如果一个数是循环小数,记为0.(a),a的长度是b,展开式为a*(1/10^b+1/10^2b+...10^nb)
按照等比数列求和公式0.(a)=a*(1-q^n)/(1-q),当n趋向无穷,等于a/(1-q)=a/(1-1/10^b)
=a*10^b/(a^b-1),因此可以断定:长度为b的连续9组成的数一定能被a整除。
比如1/7=0.(142857),142857=999999/7,
另外,分母*2或者*5不影响循环节长度,比如1/3=0.(3),1/6=0.1(6),1/15=0.0(6),
因此可以忽略分母能被2,5整除的那些数。
实现:穷举法,对每个分母i,分别计算
余数1=10^n /i 的余数,下个余数*10
余数2=(10^n-1) /i 的余数,下个余数*10+9,例如:9/7->29/7->19/7->59/7->39/7->49/7
任何一个余数如果为0表示整除或者一轮循环节结束。
*/
/


多谢解释,这回看懂了,那个利用9999....求循环的办法真是巧妙。
你用GOTO不直接用EXIT, 有什么玄机?
下一个挑战:把这代码改成SQL

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
86#
发表于 2010-11-10 01:14 | 只看该作者
原帖由 lastwinner 于 2010-11-9 23:14 发表

2、从2~10^7-1循环
   将循环数n与prime中已有的不超过sqrt(n)的数相除,找到第一个能除尽的数prime[y],则tf[1]=prime[y],然后继续从prime[y]开始找寻(n/prime[y])的质因数,依次记录入tf[]中。
       然后根据tf中质因子个数,计算其不同的因子的个数。例如,假设tf中有3个a、4个b、1个c、一个d、2个e,则其不同因子的个数的计算公式为:
             3×4×2×5!
          记录入currFN中,并与prevFN做比较,相等则all_scfn++。之后将currFN存入prevFN中
   如果找遍了不超过sqrt(n)的prime[],还是没法找到质因数因子,则将该数存入质数数组prime中

最后阶乘怎么来的?我觉得应该是
不同因子的个数 = (3+1)*(4+1)*(1+1)*(2+1)
乘法交换律决定了排列不影响。
你有没有想过这个分解结果可被后面的tf[]使用?比如你分解出14来,那么28,42, 等等都可以利用。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
87#
发表于 2010-11-10 12:18 | 只看该作者
原帖由 newkid 于 10-11-10 01:14 发表

最后阶乘怎么来的?我觉得应该是
不同因子的个数 = (3+1)*(4+1)*(1+1)*(2+1)
乘法交换律决定了排列不影响。
你有没有想过这个分解结果可被后面的tf[]使用?比如你分解出14来,那么28,42, 等等都可以利用。


总共5个不同质因子,所以单纯只看不同的质因子,其因子总数是2^5(我汗啊,写错了…………(脑子里一直是5!=32,囧))
(回想下我们之前做的connect by求组合,性质是一样的,C(n,0)+C(n,1)+...+C(n,n)=2^n)
上面这个推算是没问题的

而我的算法问题出在后面,不应该乘以同一个因子的个数
比如说6的因子1、2、3、6,是4个
但12 的因子并非就是8个,因为上述4个因子乘以2之后,得2、4、6、12
有两个因子与前面的重复了,所以计算有相同因子有多个的数的因子的时候,只应该计算C(n,1)+...+C(n,n-1)=2^n-2,再与同因子个数相乘,最后再加上2就行了
不过这样还有问题,如果计算36的因子,按这样的思路去算:
2、3
4、6
6、9
12、18
1、36
还是有重复的
如果有多个因子还有相同的因子的,那这样思考更复杂了

验证了几个数,你的算法才是正确的,不过我还有点不理解,为什么都要加1后再相乘呢?


至于分解结果的重用,我觉得没必要存储,到时候你去查找一个数的分解结果,倒不如直接分解这个数来得快(到100万之后,每次都要在至少90万个分解结果中查找,我觉得时间成本太高了)
不过你这倒是提醒我了,如果分解后的数(即n/prime[y])不是偶数并且小于4000,那可以先到质数表中去查其是不是一个质数,如果是,分解就结束了,如果不是则继续分解

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
88#
发表于 2010-11-10 23:25 | 只看该作者
3个a、4个b、1个c、一个d、2个e:
那么你的因子里面就可以含有:

0-3个a (3+1)
0-4个b (4+1)
0-1个c (1+1)
......

分解结果的重用:
你没有必要回过头来找呀,可以从已有结果构造新的合数。

就如质数筛选法,我们是把所有倍数去除的,不是到了N再来判断N是否被2整除,被3整除,....

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
89#
发表于 2010-11-10 23:31 | 只看该作者
原帖由 newkid 于 10-11-10 23:25 发表
3个a、4个b、1个c、一个d、2个e:
那么你的因子里面就可以含有:

0-3个a (3+1)
0-4个b (4+1)
0-1个c (1+1)
......

分解结果的重用:
你没有必要回过头来找呀,可以从已有结果构造新的合数。

就如质数筛选法,我们是把所有倍数去除的,不是到了N再来判断N是否被2整除,被3整除,....



因子那块明了
后面你说的重用的意思我理解,我只是担心搜索的效率问题

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
90#
发表于 2010-11-14 13:26 | 只看该作者
原帖由 lastwinner 于 10-11-8 00:41 发表
问题13
Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
37107287533902102798797998220837590246510135740250
46376937677490009712648124896970078050417018260538
74324986199524741059474233309513058123726617309629
91942213363574161572522430563301811072406154908250
23067588207539346171171980310421047513778063246676
89261670696623633820136378418383684178734361726757
28112879812849979408065481931592621691275889832738
44274228917432520321923589422876796487670272189318
47451445736001306439091167216856844588711603153276
70386486105843025439939619828917593665686757934951
62176457141856560629502157223196586755079324193331
64906352462741904929101432445813822663347944758178
92575867718337217661963751590579239728245598838407
58203565325359399008402633568948830189458628227828
80181199384826282014278194139940567587151170094390
35398664372827112653829987240784473053190104293586
86515506006295864861532075273371959191420517255829
71693888707715466499115593487603532921714970056938
54370070576826684624621495650076471787294438377604
53282654108756828443191190634694037855217779295145
36123272525000296071075082563815656710885258350721
45876576172410976447339110607218265236877223636045
17423706905851860660448207621209813287860733969412
81142660418086830619328460811191061556940512689692
51934325451728388641918047049293215058642563049483
62467221648435076201727918039944693004732956340691
15732444386908125794514089057706229429197107928209
55037687525678773091862540744969844508330393682126
18336384825330154686196124348767681297534375946515
80386287592878490201521685554828717201219257766954
78182833757993103614740356856449095527097864797581
16726320100436897842553539920931837441497806860984
48403098129077791799088218795327364475675590848030
87086987551392711854517078544161852424320693150332
59959406895756536782107074926966537676326235447210
69793950679652694742597709739166693763042633987085
41052684708299085211399427365734116182760315001271
65378607361501080857009149939512557028198746004375
35829035317434717326932123578154982629742552737307
94953759765105305946966067683156574377167401875275
88902802571733229619176668713819931811048770190271
25267680276078003013678680992525463401061632866526
36270218540497705585629946580636237993140746255962
24074486908231174977792365466257246923322810917141
91430288197103288597806669760892938638285025333403
34413065578016127815921815005561868836468420090470
23053081172816430487623791969842487255036638784583
11487696932154902810424020138335124462181441773470
63783299490636259666498587618221225225512486764533
67720186971698544312419572409913959008952310058822
95548255300263520781532296796249481641953868218774
76085327132285723110424803456124867697064507995236
37774242535411291684276865538926205024910326572967
23701913275725675285653248258265463092207058596522
29798860272258331913126375147341994889534765745501
18495701454879288984856827726077713721403798879715
38298203783031473527721580348144513491373226651381
34829543829199918180278916522431027392251122869539
40957953066405232632538044100059654939159879593635
29746152185502371307642255121183693803580388584903
41698116222072977186158236678424689157993532961922
62467957194401269043877107275048102390895523597457
23189706772547915061505504953922979530901129967519
86188088225875314529584099251203829009407770775672
11306739708304724483816533873502340845647058077308
82959174767140363198008187129011875491310547126581
97623331044818386269515456334926366572897563400500
42846280183517070527831839425882145521227251250327
55121603546981200581762165212827652751691296897789
32238195734329339946437501907836945765883352399886
75506164965184775180738168837861091527357929701337
62177842752192623401942399639168044983993173312731
32924185707147349566916674687634660915035914677504
99518671430235219628894890102423325116913619626622
73267460800591547471830798392868535206946944540724
76841822524674417161514036427982273348055556214818
97142617910342598647204516893989422179826088076852
87783646182799346313767754307809363333018982642090
10848802521674670883215120185883543223812876952786
71329612474782464538636993009049310363619763878039
62184073572399794223406235393808339651327408011116
66627891981488087797941876876144230030984490851411
60661826293682836764744779239180335110989069790714
85786944089552990653640447425576083659976645795096
66024396409905389607120198219976047599490197230297
64913982680032973156037120041377903785566085089252
16730939319872750275468906903707539413042652315011
94809377245048795150954100921645863754710598436791
78639167021187492431995700641917969777599028300699
15368713711936614952811305876380278410754449733078
40789923115535562561142322423255033685442488917353
44889911501440648020369068063960672322193204149535
41503128880339536053299340368006977710650566631954
81234880673210146739058568557934581403627822703280
82616570773948327592232845941706525094512325230608
22918802058777319719839450180888072429661980811197
77158542502016545090413245809786882778948721859617
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722
53503534226472524250874054075591789781264330331690


求出这100个50位数字的和的前10位
————————————————————————————————————————————

如果只考虑前20位数字相加,能否同样的结果?



set numwidth 50;
with src as (select '37107287533902102798797998220837590246510135740250
46376937677490009712648124896970078050417018260538
74324986199524741059474233309513058123726617309629
91942213363574161572522430563301811072406154908250
23067588207539346171171980310421047513778063246676
89261670696623633820136378418383684178734361726757
28112879812849979408065481931592621691275889832738
44274228917432520321923589422876796487670272189318
47451445736001306439091167216856844588711603153276
70386486105843025439939619828917593665686757934951
62176457141856560629502157223196586755079324193331
64906352462741904929101432445813822663347944758178
92575867718337217661963751590579239728245598838407
58203565325359399008402633568948830189458628227828
80181199384826282014278194139940567587151170094390
35398664372827112653829987240784473053190104293586
86515506006295864861532075273371959191420517255829
71693888707715466499115593487603532921714970056938
54370070576826684624621495650076471787294438377604
53282654108756828443191190634694037855217779295145
36123272525000296071075082563815656710885258350721
45876576172410976447339110607218265236877223636045
17423706905851860660448207621209813287860733969412
81142660418086830619328460811191061556940512689692
51934325451728388641918047049293215058642563049483
62467221648435076201727918039944693004732956340691
15732444386908125794514089057706229429197107928209
55037687525678773091862540744969844508330393682126
18336384825330154686196124348767681297534375946515
80386287592878490201521685554828717201219257766954
78182833757993103614740356856449095527097864797581
16726320100436897842553539920931837441497806860984
48403098129077791799088218795327364475675590848030
87086987551392711854517078544161852424320693150332
59959406895756536782107074926966537676326235447210
69793950679652694742597709739166693763042633987085
41052684708299085211399427365734116182760315001271
65378607361501080857009149939512557028198746004375
35829035317434717326932123578154982629742552737307
94953759765105305946966067683156574377167401875275
88902802571733229619176668713819931811048770190271
25267680276078003013678680992525463401061632866526
36270218540497705585629946580636237993140746255962
24074486908231174977792365466257246923322810917141
91430288197103288597806669760892938638285025333403
34413065578016127815921815005561868836468420090470
23053081172816430487623791969842487255036638784583
11487696932154902810424020138335124462181441773470
63783299490636259666498587618221225225512486764533' xx from dual union
select '67720186971698544312419572409913959008952310058822
95548255300263520781532296796249481641953868218774
76085327132285723110424803456124867697064507995236
37774242535411291684276865538926205024910326572967
23701913275725675285653248258265463092207058596522
29798860272258331913126375147341994889534765745501
18495701454879288984856827726077713721403798879715
38298203783031473527721580348144513491373226651381
34829543829199918180278916522431027392251122869539
40957953066405232632538044100059654939159879593635
29746152185502371307642255121183693803580388584903
41698116222072977186158236678424689157993532961922
62467957194401269043877107275048102390895523597457
23189706772547915061505504953922979530901129967519
86188088225875314529584099251203829009407770775672
11306739708304724483816533873502340845647058077308
82959174767140363198008187129011875491310547126581
97623331044818386269515456334926366572897563400500
42846280183517070527831839425882145521227251250327
55121603546981200581762165212827652751691296897789
32238195734329339946437501907836945765883352399886
75506164965184775180738168837861091527357929701337
62177842752192623401942399639168044983993173312731
32924185707147349566916674687634660915035914677504
99518671430235219628894890102423325116913619626622
73267460800591547471830798392868535206946944540724
76841822524674417161514036427982273348055556214818
97142617910342598647204516893989422179826088076852
87783646182799346313767754307809363333018982642090
10848802521674670883215120185883543223812876952786
71329612474782464538636993009049310363619763878039
62184073572399794223406235393808339651327408011116
66627891981488087797941876876144230030984490851411
60661826293682836764744779239180335110989069790714
85786944089552990653640447425576083659976645795096
66024396409905389607120198219976047599490197230297
64913982680032973156037120041377903785566085089252
16730939319872750275468906903707539413042652315011
94809377245048795150954100921645863754710598436791
78639167021187492431995700641917969777599028300699
15368713711936614952811305876380278410754449733078
40789923115535562561142322423255033685442488917353
44889911501440648020369068063960672322193204149535
41503128880339536053299340368006977710650566631954
81234880673210146739058568557934581403627822703280
82616570773948327592232845941706525094512325230608
22918802058777319719839450180888072429661980811197
77158542502016545090413245809786882778948721859617
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722
53503534226472524250874054075591789781264330331690'  from dual),
s as (select regexp_substr(xx,'\d{50}',1, rn) xx from src, (select rownum rn from dual connect by rownum<=60)),
num as (select to_number(substr(xx,1,20)) nb, to_number(substr(xx,21)) ne from s where xx is not null)
select sum(nb), sum(ne) from num
/


                                           SUM(NB)
--------------------------------------------------
                                           SUM(NE)
--------------------------------------------------
                            5537376230390876637249
                  53048746832985971773659831892672
sum(nb)有22位
sum(ne)有32位
sum(ne)的前两位能进位,但尚不足以影响到前十位
故而前十位是 5537376230


btw:sorry,这个是问题13,原来写成问题12 了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表