黑马程序员技术交流社区

标题: 来一道经典的面试笔试题( 1-2+3-4+……+m) [打印本页]

作者: wanghuailin1030    时间: 2013-6-14 12:53
标题: 来一道经典的面试笔试题( 1-2+3-4+……+m)
本帖最后由 wanghuailin1030 于 2013-6-16 20:54 编辑

求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m

我先写一种,希望大家能把所有的实现方法全部列出来:
int m = Convert.ToInt32(this.TextBox1.Text) ;
int sum = 0 ;
for (int i = 0 ; i < m + 1 ; i++)
{
if((i%2) == 1)
{
sum += i ;
}
Else
{
sum = Sum - I ;
}
}
System.Console.WriteLine(sum.ToString());
System.Console.ReadLine() ;

作者: 许庭洲    时间: 2013-6-14 13:09
int m = Convert.ToInt32(this.TextBox1.Text) ;
int sum1= 0 ;
int sum2= 0 ;
for (int i = 0 ; i < m + 1 ; i=i+2)
{
      sum1 += i ;
}

for (int j= 1 ;j< m + 1 ;j=j+2)
{
      sum2 +=j ;
}

System.Console.WriteLine("表达式最后的计算结果是{0}",sum2-sum1);
System.Console.ReadLine() ;

作者: 高腾    时间: 2013-6-14 13:14
我使用控制台输出的,使用的类似绝对值方法
  1.     class Program
  2.     {   // 1-2+3-4+……+m
  3.         static void Main(string[] args)
  4.         {
  5.             Console.Write("请输入您想执行的表达式");
  6.             string strs = Console.ReadLine();//接收用户输入的字符串 比如1-2+3
  7.             string lastStr = strs.Substring(strs.Length - 1);//取出最后一个字符串“3”
  8.             int lastNum = Convert.ToInt32(lastStr);
  9.             int result = Sum(lastNum);//将最后一个字符串以整数形式当参数传递
  10.             Console.WriteLine(result);
  11.             Console.ReadKey();
  12.         }

  13.         static int Sum(int m)
  14.         {
  15.             int sum = 0;
  16.             for (int i = 0; i <= m; i++)
  17.             {
  18.                 //如果i为偶数,则将i变为-i
  19.                 if (i % 2 == 0)
  20.                 {
  21.                     i = 0 - i;
  22.                     sum = sum + i;
  23.                     i = 0 - i;//最后还需要将i还原
  24.                     continue;//进入下一次循环
  25.                 }
  26.                 sum = sum + i;
  27.             }
  28.             return sum;
  29.         }
  30.     }
复制代码
我觉得我的方法通俗易懂一些 {:soso_e113:}
作者: 赵洋3916    时间: 2013-6-14 13:18
Console.Write("请输入一个整数:m=");
            int m = Convert.ToInt32(Console.ReadLine());//获取用户输入的值
            int sum = 0;
            //判断输入的数字是奇数还是偶数
            if (m % 2 == 0)
            {
                sum = -m / 2;//m是偶数的算法
            }
            else
            {
                sum = -(m - 1) / 2 + m;//m是奇数的算法

            }
            Console.WriteLine("结果为{0}",sum);//输出结果
            Console.ReadLine();
作者: 彭康    时间: 2013-6-14 13:19
int m = Convert.ToInt32(this.TextBox1.Text) ;
int sum = 0 ;
sum =m-(m-1)/2;
System.Console.WriteLine(sum.ToString());
System.Console.ReadLine() ;
作者: 陈壹    时间: 2013-6-14 13:54
static void Main(string[] args)
        {
            int n, m, sum = 0;
            do{
                Console.WriteLine("请输入初始数字");
            string str_1=Console.ReadLine();
            Console.WriteLine("请输入结束数字");
            string str_2=Console.ReadLine();
                if(int.TryParse(str_1,out n)==false  || int.TryParse(str_2,out m)==false)
                {Console.WriteLine("你输入的数值有误,请重新输入");
                }else{break;}
            }while(true);
            for (; n < m + 1; n++) {
                switch (n % 2) {
                    case 0:sum-=n;break;
                    case 1: sum += n; break;
                }
            }
            Console.WriteLine("和为{0}",sum);
            Console.ReadKey();
        }
作者: 甘斌斌    时间: 2013-6-14 14:09
int m = Convert.ToInt32(this.TextBox1.Text) ;
int n1= 0 ;
int n2= 0 ;
for (int i = 0 ; i < m + 1 ; i=i+2)
{
      n1 += i ;
}

for (int j= 1 ;j< m + 1 ;j=j+2)
{
      n2 +=j ;
}
System.Console.ReadLine() ;

作者: 陈壹    时间: 2013-6-14 14:10

        static void Main(string[] args)
        {
            int n, m, sum = 0;
            do{
                Console.WriteLine("请输入初始数字");
            string str_1=Console.ReadLine();
            Console.WriteLine("请输入结束数字");
            string str_2=Console.ReadLine();
                if(int.TryParse(str_1,out n)==false  || int.TryParse(str_2,out m)==false)
                {Console.WriteLine("你输入的数值有误,请重新输入");
                }else{break;}
            }while(true);
            if (n % 2 == 0)
            {
                switch (m % 2)
                {
                    case 0: sum = ((m + 1) - n) / 2 - m; break;
                    case 1: sum = ((m + 1) - n) / 2; break;
                }
            }
            else
            {
                switch (m % 2)
                {
                    case 0: sum = 0-((m + 1) - n) / 2 ; break;
                    case 1: sum = m-((m + 1) - n) / 2; break;
                }
            }
                      Console.WriteLine("和为{0}",sum);
            Console.ReadKey();
作者: 李云飞    时间: 2013-6-14 15:56
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 循环加减
{
    class Program
    {
        static void Main(string[] args)
        {
            int m = 10;
            double sum = 0d;
            for (int i = 1 ; i <= m ; i++)
            {
                sum = sum + Math.Pow(-1, (i+1)) * i;
            }
            System.Console.WriteLine(sum);
            System.Console.ReadLine() ;
        }
    }
}
楼主 ,可以参考下,如有不妥请提出来。谢谢!
作者: aa26963    时间: 2013-6-14 16:44
不用循环吧,先取到表达式的最后一个字符m,转换成int型。
如果m是偶数,那么结果为m/2切为负的,应该是0-m/2;
如果是奇数,应该就是(m+1)/2

   
作者: 穆玉明    时间: 2013-6-14 19:34
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {


            //第一种方法
            Console.WriteLine("请输入m的值");
            int m = Convert.ToInt32(Console.ReadLine());
            int sum1 = 0;
            int sum2 = 0;
            int sum = 0;
            if(m%2==0)
            {
                for (int i = 1; i <= m - 1;i+=2)
                {
                    sum1 = sum1 + i;
                    sum2 = sum2+(i + 1);
                    sum = sum1-sum2;
                }
               
            }
            else
            {
                for (int i = 1; i <= m ; i += 2)
                {
                    sum1 = sum1 + i;
                    sum2 = sum2+i + 1;
                    sum =  sum2-sum1;
                }

            }
            Console.WriteLine(sum);
            Console.ReadKey();


            //第二种方法

            //Console.WriteLine("请输入m的值");
            //int m = Convert.ToInt32(Console.ReadLine());
            //int sum = 0;
            //if (m % 2 == 0)
            //{
            //    sum = (-1) * m / 2;
            //}
            //else
            //{
            //    sum = (-1) * m/ 2 + m;
            //}
            //Console.WriteLine(sum);
            //Console.ReadKey();
        }
    }
}


我这个程序中写了两种方法  
作者: 穆玉明    时间: 2013-6-14 19:40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {


            //第一种方法
            Console.WriteLine("请输入m的值");
            int m = Convert.ToInt32(Console.ReadLine());//接收用户输入的值
            int sum1 = 0;
            int sum2 = 0;
            int sum = 0;
            if(m%2==0)//判断m时候是偶数
            {
                for (int i = 1; i <= m - 1;i+=2)//这个循环主要是计算m是偶数时的和
                {
                    sum1 = sum1 + i;  //所有基数的和
                    sum2 = sum2+(i + 1);//所有偶数的和
                    sum = sum1-sum2;
                }
               
            }
            else
            {
                for (int i = 1; i <= m ; i += 2)
                {
                    sum1 = sum1 + i;
                    sum2 = sum2+i + 1;
                    sum =  sum2-sum1;
                }

            }
            Console.WriteLine(sum);
            Console.ReadKey();


            //第二种方法

            //Console.WriteLine("请输入m的值");
            //int m = Convert.ToInt32(Console.ReadLine());
            //int sum = 0;
            //if (m % 2 == 0)//m为偶数时
            //{
            //    sum = (-1) * m / 2;  //因为1-2=-1,3-4=-1 以此类推,m/2是一共有多少个-1
            //}
            //else
            //{
            //    sum = (-1) * m/ 2 + m;//这里判断m以前有多少个-1,最后再加上m的值   这里我写成sum=(-1)*(m-1)/2其实一样
            //}
            //Console.WriteLine(sum);
            //Console.ReadKey();
        }
    }
}

刚才没有解释   配上解释  各位再看看   
作者: 蔓越莓    时间: 2013-6-14 19:53
  1. static void Main(string[] args)
  2.         {
  3.             Console.WriteLine("请输入m=");
  4.             int sum = 0, j = 0;
  5.             int m = Convert.ToInt32(Console.ReadLine());
  6.             for (int i = 1; i <=m; i++)
  7.             {
  8.                 if (i % 2 == 0)
  9.                 {
  10.                     j = -i;
  11.                 }
  12.                 else
  13.                 {
  14.                     j = i;
  15.                 }
  16.                 sum += j;
  17.             }
  18.             Console.WriteLine("sum="+sum);
  19.             Console.ReadKey();

  20.         }
复制代码

作者: wanghuailin1030    时间: 2013-6-14 22:02
高腾 发表于 2013-6-14 13:14
我使用控制台输出的,使用的类似绝对值方法我觉得我的方法通俗易懂一些  ...

i=0-i为什么不是i=-1*i;
作者: wanghuailin1030    时间: 2013-6-14 22:04
高腾 发表于 2013-6-14 13:14
我使用控制台输出的,使用的类似绝对值方法我觉得我的方法通俗易懂一些  ...

i=0-i为什么不是i=-1*i;
作者: 高腾    时间: 2013-6-14 22:05
wanghuailin1030 发表于 2013-6-14 22:02
i=0-i为什么不是i=-1*i;

这个都一样,只要能把i变成相反数就行
作者: wanghuailin1030    时间: 2013-6-14 22:10
赵洋3916 发表于 2013-6-14 13:18
Console.Write("请输入一个整数:m=");
            int m = Convert.ToInt32(Console.ReadLine());//获取 ...

这是不是等差数列的算法,公式我忘了,你能贴上么?
作者: wanghuailin1030    时间: 2013-6-14 22:19
彭康 发表于 2013-6-14 13:19
int m = Convert.ToInt32(this.TextBox1.Text) ;
int sum = 0 ;
sum =m-(m-1)/2;

大哥,这个不成,看你的楼上
作者: wanghuailin1030    时间: 2013-6-14 22:27
本帖最后由 wanghuailin1030 于 2013-6-14 22:28 编辑
陈壹 发表于 2013-6-14 13:54
static void Main(string[] args)
        {
            int n, m, sum = 0;


这个很全,有错误输入的判断,而且初始值也能改变。看着也很整齐,容易理解。
作者: wanghuailin1030    时间: 2013-6-14 22:30
甘斌斌 发表于 2013-6-14 14:09
int m = Convert.ToInt32(this.TextBox1.Text) ;
int n1= 0 ;
int n2= 0 ;

你对比一下第一个回复的
作者: wanghuailin1030    时间: 2013-6-14 22:38
本帖最后由 wanghuailin1030 于 2013-6-14 22:44 编辑
陈壹 发表于 2013-6-14 14:10
static void Main(string[] args)
        {
            int n, m, sum = 0;


哦,你是先判断第一个数字,如果是偶数,则为负数开始想加,如果是奇数则是从正数开始加。严格按照公式来弄。
作者: 彭康    时间: 2013-6-14 22:57
wanghuailin1030 发表于 2013-6-14 22:19
大哥,这个不成,看你的楼上

我去 比我早发几秒,我这个是默认 最后是+M
作者: wanghuailin1030    时间: 2013-6-14 23:01
李云飞 发表于 2013-6-14 15:56
using System;
using System.Collections.Generic;
using System.Linq;

你的省却了正负分开计算,省却了判断正负,而是把-1的几次幂来规定正负想加。
作者: 胡章诚    时间: 2013-6-15 07:53
static void Main(string[] args)
        {
            Console.WriteLine("请输入一个正整数");
            int m = int.Parse(Console.ReadLine());

            int sum = 0;
            if (m % 2 == 1)
            {
                sum = (m + 1) / 2;
            }
            else
            {
                sum=(m / 2) * (-1);
            }
            Console.WriteLine("总和为{0}",sum.ToString());
            Console.ReadKey();
        }
作者: wanghuailin1030    时间: 2013-6-15 09:49
穆玉明 发表于 2013-6-14 19:40
using System;
using System.Collections.Generic;
using System.Linq;

这个高端
作者: wanghuailin1030    时间: 2013-6-15 10:14
胡章诚 发表于 2013-6-15 07:53
static void Main(string[] args)
        {
            Console.WriteLine("请输入一个正整数");

这个也不错,算法是之间没见过的
作者: 孤帆破浪    时间: 2013-6-15 10:36
aa26963 发表于 2013-6-14 16:44
不用循环吧,先取到表达式的最后一个字符m,转换成int型。
如果m是偶数,那么结果为m/2切为负的,应该是0-m ...

的确是这样耶,学习了!:handshake
作者: 孤帆破浪    时间: 2013-6-15 10:49
看了下楼上诸位的,感觉和我做的都大同小异,就10楼的方法让人耳目一新,学习了!
附上我的方法吧:
static void Main(string[] args)
        {

            int sum = 0;      //累加初始值
            int m, sign;       //m是最后结束的值,sign是每个数前面的符号
            Console.WriteLine("请输入m的值:");
            string str = Console.ReadLine();
            if (int.TryParse(str, out m) == true)
            {
                for (int i = 1; i <= m; i++)
                {
                    if (i % 2 == 0)       //如果该数为奇数,则符号sign=-1
                    {
                        sign = -1;
                    }
                    else               //为偶数时,sign=1
                    {
                        sign = 1;
                    }
                    sum += i * sign;           //累加
                }
            }
            else
            {
                Console.WriteLine("数字不合法!");
            }
            Console.WriteLine("该表达式的值是:{0}", sum);
                        //下面是我用10楼的方法尝试了一下
            if (m % 2 == 0)
            {
                sum = -m / 2;
            }
            else
            {
                sum = (m + 1) / 2;
            }
            Console.WriteLine("该表达式的值是:{0}", sum);

            Console.ReadKey();
            

        }

作者: wanghuailin1030    时间: 2013-6-15 13:01
孤帆破浪 发表于 2013-6-15 10:49
看了下楼上诸位的,感觉和我做的都大同小异,就10楼的方法让人耳目一新,学习了!
附上我的方法吧:
static ...

10楼的方法在24楼有代码实现,确实是耳目一新
作者: 孤帆破浪    时间: 2013-6-16 09:38
wanghuailin1030 发表于 2013-6-15 13:01
10楼的方法在24楼有代码实现,确实是耳目一新

呵呵!此楼有点多,后面的不是每一个都仔细看过。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2