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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨进 中级黑马   /  2012-9-20 19:20  /  3103 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨进 于 2012-9-20 19:33 编辑

写了一个亲密数的程序
  1. int sumI;
  2.             int sumJ;

  3.             for (int i = 1; i <= 3000; i++)
  4.             {
  5.                 sumI = 0;
  6.                 sumJ = 0;
  7.                 for (int h = 1; h < i; h++)
  8.                 {
  9.                     if (i % h == 0)
  10.                     {
  11.                         sumI += h;
  12.                     }
  13.                 }
  14.                 if (sumI <= 3000)
  15.                 {
  16.                     for (int k = 1; k < sumI; k++)
  17.                     {
  18.                         if (sumI % k == 0)
  19.                         {
  20.                             sumJ += k;
  21.                         }
  22.                     }
  23.                     if (sumJ == i&&i!=sumI)
  24.                     {
  25.                         Console.WriteLine("{0}与{1}是一对亲密数",i,sumI);
  26.                     }
  27.                 }
  28.             }
  29.             Console.ReadKey();
复制代码
运行下来结果是这样的
220与284是一对亲密数
284与220是一对亲密数
1184与1210是一对亲密数
1210与1184是一对亲密数
2620与2924是一对亲密数
2924与2620是一对亲密数
每一对都重复了一次。
自己想了下,可以把得到的数据存到一个数组中,然后每次循环开始加判断,如果i在数组中,则contine到下一个循环,但是这样做的坏处是事先不知道会求出几对亲密数,因此数组长度不好定义。
各位大侠,有什么好方法能让输出结果不重复。

评分

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

查看全部评分

7 个回复

倒序浏览
参数数组:C#提供了一个特殊的关键字,它允许在调用一个方法时提供数量可变的参数,而不是由方法事先固定好参数的数量。
1. int sum(params  int[] values)
2. int sum(string name,params int[] values)
注意:可变参数数组必须是最后一个
回复 使用道具 举报
许庭洲 发表于 2012-9-21 08:03
参数数组:C#提供了一个特殊的关键字,它允许在调用一个方法时提供数量可变的参数,而不是由方法事先固定好 ...

总得有个数组来接收已经求过的亲密数吧,怎么让它这个数组的长度可变
回复 使用道具 举报
许庭洲 发表于 2012-9-21 08:03
参数数组:C#提供了一个特殊的关键字,它允许在调用一个方法时提供数量可变的参数,而不是由方法事先固定好 ...

你的答复提示了我,可以写个方法,让经过这个方法的数组长度+2
  1. private static int[] StoreNum(int[] numArray,int num1, int num2)
  2.         {
  3.             int[] temp = numArray;
  4.             numArray = new int[numArray.Length + 2];
  5.             for (int i = 0; i < numArray.Length - 2; i++)
  6.             {
  7.                 numArray[i] = temp[i];
  8.             }
  9.             numArray[numArray.Length - 2] = num1;
  10.             numArray[numArray.Length - 1] = num2;
  11.             return numArray;
  12.         }

  13.         static void Main(string[] args)
  14.         {
  15.             int[] storeNum = new int[0];
  16.             int sumI;
  17.             int sumJ;
  18.             bool flag;

  19.             int[] num12 = { 0, 1 };
  20.             int[] num23 = { 0, 1, 2, 3 };
  21.             num12 = num23;


  22.             for (int i = 1; i <= 3000; i++)
  23.             {
  24.                 flag = true;
  25.                 sumI = 0;
  26.                 sumJ = 0;
  27.                 for (int j = 1; j < storeNum.Length; j++)
  28.                 {
  29.                     if (i == storeNum[j])
  30.                     {
  31.                         flag = false;
  32.                         break;
  33.                     }
  34.                 }
  35.                 if (flag == false)
  36.                 {
  37.                     continue;
  38.                 }
  39.                 for (int h = 1; h < i; h++)
  40.                 {
  41.                     if (i % h == 0)
  42.                     {
  43.                         sumI += h;
  44.                     }
  45.                 }
  46.                 if (sumI <= 3000)
  47.                 {
  48.                     for (int k = 1; k < sumI; k++)
  49.                     {
  50.                         if (sumI % k == 0)
  51.                         {
  52.                             sumJ += k;
  53.                         }
  54.                     }
  55.                     if (sumJ == i && i != sumI)
  56.                     {
  57.                         Console.WriteLine("{0}与{1}是一对亲密数", i, sumI);
  58.                         storeNum=StoreNum(storeNum, i, sumI);
  59.                     }
  60.                 }
  61.             }
  62.             Console.ReadKey();
  63. }
复制代码
回复 使用道具 举报
把这3000个数字定义成一个数组,好像效果会更好
  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

查看全部评分

回复 使用道具 举报
研究了下,笨方法一枚,高手继续补充
  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-10-19 13:26:22
7#
楼主可把输出前的if条件改一下:
for (int i = 1; i <= 3000; i++)//第一个for循环,就是1-3000的实实在在的数
            {
                int sum1 = 0, sum2 = 0;//在这个大循环中需要用到两个变量,存储因子的和
                for (int j = 1; j < i; j++)//第二个for循环,就是需要一个被除数,当i的值固定时,j的值变化
                {
                    if (i % j == 0)//如果被除数j符合此条件,则j为一个因子
                    {
                        sum1 += j;//将合法的因子相加求和
                    }
                }
                    if (sum1 <= 3000)               
                    {                                
                        for (int k = 1; k < sum1; k++)                           
                        {                             
                            if (sum1 % k == 0)        
                            {
                                sum2 += k;
                            }
                        }
                        if (sum2 == i && sum1 > i)//i=220时,sum1=284,sum2=220;i=284时,sum1=220,sum2=284
                        {                    //所以,这是一种情形,sum1和i必定是一大一小的,可改下if条件就行了。
                            Console.WriteLine("{0},{1}", i,sum1);

                        }
                    }                                                   
            }
            Console.ReadKey();
回复 使用道具 举报
杨进 中级黑马 2012-10-19 18:10:03
8#
蔡嘉 发表于 2012-10-19 13:26
楼主可把输出前的if条件改一下:
for (int i = 1; i

有道理:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马