A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李 玉林 中级黑马   /  2012-9-11 11:58  /  3024 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果整数A的所有因子(包括1,不包括整数本身)之和等于整数B,并且整数B的所有因子(包括1,不包括整数本身)之和等于A,则将整数A和整数B称为亲密数.求3000以内的所有亲密数.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

8 个回复

正序浏览
本帖最后由 李阳_TickTock 于 2012-9-23 12:33 编辑
杨进 发表于 2012-9-23 11:02
到10万级别的时候,真的不是这么规律的,

呃,我只验证到1万,不严谨不严谨。。我现在算下一百万试试


算100万算了一个小时

输出1和3,5和7,,,,确实是没有依据的



PS:1-100万,一共有82对亲密数
回复 使用道具 举报
杨进 中级黑马 2012-9-23 11:08:04
8#
{:soso_e103:}非常庞大的数字,你该不会搞个几百亿几千亿吧。。那超出咱的研究范围咯
回复 使用道具 举报
杨进 中级黑马 2012-9-23 11:02:50
7#
李阳_TickTock 发表于 2012-9-23 10:43
输出1和3,5和7,你观察下数组里面的规律就明白了,它就是这么排列的,不管后面出来多少对亲密数,它的排列 ...

到10万级别的时候,真的不是这么规律的,{:soso_e120:}

2.jpg (91.59 KB, 下载次数: 37)

2.jpg

3.jpg (22.83 KB, 下载次数: 39)

3.jpg
回复 使用道具 举报
本帖最后由 李阳_TickTock 于 2012-9-23 10:53 编辑
杨进 发表于 2012-9-23 10:19
我倒是认为你最后输出1和3,5和7一点数学依据都没有,不过把得到的数字加上逗号存到一个字符串中这点子真 ...

输出1和3,5和7,你观察下数组里面的规律就明白了,它就是这么排列的,不管后面出来多少对亲密数,它的排列顺序都是这样

数组长度不是说时间怎么怎么长,而是空间
一个int32占用4字节的空间
1KB的内存空间就是256个int32
一百万个是3906KB,差不多4M的内存

内存空间是非常宝贵的,而用计算机来进行科学计算是不可能仅仅是百万级的,所以我认为有多少个数就声明一个长度是多少的数组是不可行的
:P



不过我刚刚才看视频发现,string是个很特殊的东西,它的值是不可改变的,每次对它改变,都会重新分配一块新的内存空间,然后指针指向新的内存空间,旧的内存空间中的内容并不会立即消除,所以我这个方法可能比你声明一个长度非常恐怖的数组更占空间{:soso_e149:}

所以结果就是,如果要计算一个1到一个非常庞大的数字中的亲密数
你的程序,一开始运行就死了
我的程序,运行了一段时间后,死了

最后,我们都死了{:soso_e101:}
回复 使用道具 举报
本帖最后由 杨进 于 2012-9-23 10:30 编辑
李阳_TickTock 发表于 2012-9-22 15:05
刚好写了一个,楼上的,如果有十万个数,你就定义一个长度十万的数组?一百万呢? ...


我倒是认为你最后输出1和3,5和7一点数学依据都没有,不过把得到的数字加上逗号存到一个字符串中这点子真不错。
而且定义一个100万的数组真的是几秒钟的事,耗时间的是后面的循环和判断,你可以试试:
int[] numArray = new int[1000000];
            for (int i = 0; i < 1000000; i++)
            {
                numArray = i + 1;
            }

1.jpg (96.94 KB, 下载次数: 52)

1.jpg
回复 使用道具 举报
刚好写了一个,楼上的,如果有十万个数,你就定义一个长度十万的数组?一百万呢?
  1. int num1 = 0;
  2.             int num2 = 0;
  3.             int a = 0;
  4.             int b = 0;
  5.             string tmp = "";
  6.             int count = 0;


  7.             string[] result = null;
  8.             for (int i = 1; i <= 3000; i++) {
  9.                 a = i;
  10.                 for (int j = 1; j < i; j++) {
  11.                     if (i % j == 0) {
  12.                         //i的因子和
  13.                         num1 += j;
  14.                     }
  15.                     b = num1;
  16.                 }
  17.                 //Console.WriteLine(num1.ToString());
  18.                 for (int k = 1; k < num1; k++) {
  19.                     if (b % k == 0) {
  20.                         //b的因子和
  21.                         num2 += k;
  22.                     }
  23.                 }
  24.                 //a的因子和等于b,b的因子和等于a,且a不等于b
  25.                 if (num1 == b && num2 == a && a!=b)
  26.                 {
  27.                   
  28.                   
  29.                     tmp += a + "," + b+",";
  30.                 }
  31.                 num1 = 0;
  32.                 num2 = 0;
  33.             }
  34.             //算出有几对亲密数
  35.             for (int i = 0; i < tmp.Length; i++) {
  36.                 if(tmp.Substring(i,1)==","){
  37.                     count++;
  38.                 }
  39.             }
  40.             //new一个数组存放结果
  41.             result = new string[count];
  42.             count = 0;
  43.             for (int i = 0; i < tmp.Length; i++) {
  44.                 //读取字符串,如果是逗号,标记自加
  45.                 if(tmp.Substring(i,1)==","){
  46.                     count++;
  47.                 }
  48.                 //否则将当前字符加入数组当前位置
  49.                 else {
  50.                     result[count] += tmp.Substring(i, 1);
  51.                     
  52.                 }
  53.             }
  54.             //输出1和3,5和7,以此类推
  55.             for (int i = 0; i < result.Length-2; i++) {
  56.                 if (i % 2 != 0) {
  57.                     Console.WriteLine("{0}和{1}是亲密数",result[i],result[i+2]);
  58.                     i = i + 2;
  59.                 }
  60.                
  61.             }
  62.             Console.ReadKey();
  63.            
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨进 于 2012-9-21 10:27 编辑
  1. int sumI;
  2.             int sumJ;
  3.             int[] numArray = new int[3000];
  4.             for (int i = 0; i < 3000; i++)
  5.             {
  6.                 numArray[i] = i + 1;
  7.             }

  8.             for (int i = 0; i < 3000; i++)
  9.             {
  10.                 sumI = 0;
  11.                 sumJ = 0;
  12.                 if (numArray[i] == 0)
  13.                 {
  14.                     continue;
  15.                 }
  16.                 for (int h = 1; h < numArray[i]; h++)
  17.                 {
  18.                     if (numArray[i] % h == 0)
  19.                     {
  20.                         sumI += h;
  21.                     }
  22.                 }
  23.                 if (sumI <= 3000)
  24.                 {
  25.                     for (int k = 1; k < sumI; k++)
  26.                     {
  27.                         if (sumI % k == 0)
  28.                         {
  29.                             sumJ += k;
  30.                         }
  31.                     }
  32.                     if (sumJ == numArray[i] && numArray[i] != sumI)
  33.                     {
  34.                         Console.WriteLine("{0}与{1}是一对亲密数", numArray[i], sumI);
  35.                         numArray[sumI-1] = 0;
  36.                     }
  37.                 }
  38.             }
  39.             Console.ReadKey();
复制代码

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 判断亲密数
{
      calss Program
      {
            static void Main(string[] args)
            {
                   Console.WriteLine("请输入整数A:");
                   string a1 = Console.ReadLine();
                   int A = Convert.ToInt32(a1);
                  
                   Console.WriteLine("请输入整数B:");
                   string b1 = Console.ReadLine();
                   int B = Convert.ToInt32(b1);

                    int i= 1;
                    int sum1= 0;
                    int sum2= 0;

                    while( i < =3000 )
                    {
                           if((A%i)==0)  
                           {  
                                    sum1 = sum1 +i ;//每次循环一次sum1的值在递增
                                    i++;
                           }
                           if((B%i)==0)  
                           {  
                                    sum2 = sum2 +i ;//每次循环一次sum2的值在递增
                                    i++;
                           }
                           else continue;
                    }
                    
                    if(sum1==sum2)
                    {
                            Console.WriteLine("整数A和整数B是亲密数");
                    }                  
                    esle
                    {
                            Console.WriteLine("整数A和整数B不是亲密数");
                    }                              
             }
       }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马