求任意给定数N(如:12321),计算1出现的次数(如:12321结果为2)。我现在的算法是:
intTemp = 0;    //统计的个数char[] chara = N.ToString().ToCharArray();  //N是要判断的数
for (int i = 0; i < chara.Length; i++)
{
    if (chara[i] == '1')
    {
        intTemp++;
    }
}各位高手能不能给个更优的算法(要求计算时间更短)

解决方案 »

  1.   

    从前到后找就已经是最快的了,至于用
    char[] chara = N.ToString().ToCharArray();  //N是要判断的数
    for (int i = 0; i < chara.Length; i++)
    {
        if (chara[i] == '1')
        {
            intTemp++;
        }
    }

    string chara = N.ToString();
    foreach(char chr in chara)
    {
    if (chara[i] == '1')
        {
            intTemp++;
        }}
    谁快,难说.
      

  2.   

    经试验,第二种算法更快,不过有点错误,正确的应该是这样的:
    string chara = N.ToString();
    foreach(char chr in chara)
    {
    if (chr == '1')
        {
            intTemp++;
        }}
      

  3.   

    哈哈
    我给大家换个思路:
    {
                string sNumber = "1212310";
                int iNumber = int.Parse(sNumber);            int l = sNumber.Length;
                int count =0;
                while (l > 0)
                {
                    if ((iNumber % 10) == 1) count++;
                    iNumber /= 10;
                    l--;
                }
                Console.WriteLine(count.ToString());
    }
    //输出3
      

  4.   

    to : fd7893(看着办吧) 
    如果像你那样,就不用计算机了,lz人工就可以了、、
      

  5.   

    //str1 源字符串;c 要找的字符串;返回个数;
    private int getNum(string str1,char c)
    {
    string []strTemp;
    strTemp = str1.Split(c);
    return strTemp.Length-1;
    }
    //我也换个思路。呵呵,可能是代码最短吧,时间不一定
      

  6.   

    哈哈
    我给大家换个思路:
    {
                string sNumber = "1212310";
                int iNumber = int.Parse(sNumber);            int l = sNumber.Length;
                int count =0;
                while (l > 0)
                {
                    if ((iNumber % 10) == 1) count++;
                    iNumber /= 10;
                    l--;
                }
                Console.WriteLine(count.ToString());
    }
    //输出3******************************
    当输入的数字很大,超过int的表示范围的时候,这种方法就不适用了。
      

  7.   

    注意:在做大循环得时候一定要把
    for (int i = 0; i < chara.Length; i++)
    {
        
    }
    换成
    int length = chara.Length;
    for (int i = 0; i < length ; i++)
    {
        
    }
    效率有非常大的差距,我测试过了,因为现在编译器不会对chara.Length优化,求属性是很费时的操作!!
      

  8.   

    dahan_wangtao(青城) ( ) 信誉:100    Blog  2006-9-11 20:26:19  得分: 0    
       
    to : fd7893(看着办吧) 
    如果像你那样,就不用计算机了,lz人工就可以了、、=======================================================================
    不要一棍子打死嘛...
    比如搜索某工资数据库里面的1的个数...说不定fd7893(看着办吧)的方法更快...
      

  9.   

    最快的肯定是用unsafe的方法,不过这种方法在.Net中讨论时难于让人启齿,甚至用unsafe比Import一个C函数,还要丢人.
      

  10.   

    当输入的数字很大,超过int的表示范围的时候,这种方法就不适用了。
    ________________________________________超过int的表示范围的时候,这种方法就不适用了?
    我看不见得,你把大数字拆开分别存到几个int中不就行了!
    如果像你那样,就不用计算机了,lz人工就可以了、、
    _____________________________________________________
    111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    你给我数数,一边保证不错!
    不要别人换种思路,就决的不对,自己先想想再说!
    我看 如果不考虑效率damofengbo() ( )的方法就很好! 简洁、方便!
      

  11.   

    超过int的表示范围的时候,这种方法就不适用了?
    我看不见得,你把大数字拆开分别存到几个int中不就行了!*********************************
    我只是针对那段代码而言的
    当然,把大数拆分成几个int是可行,不过得需要另外写一个大数类,耗费人力专门为解决这个问题而写一个大数类是不是得不偿失呢? 而且要是实现的不好,效率也不一定会比逐个分析字符串中的字符的方法高.
      

  12.   

    intTemp = 0;    //统计的个数char[] chara = N.ToString().ToCharArray();  //N是要判断的数
    for (int i = 0,j=chara.Length-1; i < =j; i++,j--)
    {
        if (chara[i] == '1')
        {
            intTemp++;
        }
            if (chara[j] == '1')
        {
            intTemp++;
        }
    }
      

  13.   

    还j是用分治法吧(效率最高):
    int cout(char[] chara,const char &c,int left,int right)
    {
    int middle=(left+right)/2;
    if(left<=right)
    {
    if(chara[middle]==c)  intTemp++;
    cout(chara,c,left,middle-1);
    cout(chara,c,middle+1,right);
    }
    else return intTemp;
    }
    int intTemp = 0;    //统计的个数
    Main()
    {
    ~
    char[] chara = N.ToString().ToCharArray();  //N是要判断的数
    int len=chara.length;
    char c='1';
    int total;//1的总个数total=int cout( chara,c,0,len);
    }
      

  14.   

    To:
     leonchenjian(小黑) ( ) 信誉:100    Blog 当然,把大数拆分成几个int是可行,不过得需要另外写一个大数类,耗费人力专门为解决这个问题而写一个大数类是不是得不偿失呢? 而且要是实现的不好,效率也不一定会比逐个分析字符串中的字符的方法高.
    _________________________________________    写一个大数类?不用吧? 大数因为过长不可能存储在int、long 等数值类型中,而肯定是存储在字符串类型中的,至于拆分string,substring()就可以搞定,转int、long方法 int.Parse()就好了。当然这样一来数值计算的优势就不存在了,因为substring()、Parse()都是字符操作,此算法的效率必定大打折扣,就算自己重写一个方法实现拆分效率亦未必高,综合来看还是得不偿失。但对于处理存储在int、long等数值型变量中的数据时我的算法有着绝对的优势。    但这些都没有什么关系,我们只是在讨论问题的解决方式吧?字符的比较写到天上不也就那么几样吗?翻来覆去也就没有了新鲜感,而我的本意只是开阔一下大家的思路,起一个抛砖引玉的作用。
      

  15.   

    new Regex("1").Matches("123456123456123456").Count.ToString()