[算法]有趣算法合辑[31-40]

题目31:八进制转换为十进制

1.程序分析:           
2.程序源码:

main()
{ char *p,s[6];int n;
  p=s;
  gets(p);
  n=0;
  while(*(p)!='\0')
  {n=n*8+*p-'0';
  p++;}
  printf("%d",n);
}

题目32:求0—7所能组成的奇数个数。

1.程序分析:
2.程序源码:
main()
{
  long sum=4,s=4;
  int j;
  for(j=2;j<=8;j++)/*j is place of number*/
  { printf("\n%ld",sum);
  if(j<=2)
  s*=7;
  else
  s*=8;
  sum+=s;}
  printf("\nsum=%ld",sum);
}

题目33:一个偶数总能表示为两个素数之和。

1.程序分析:
2.程序源码:
#include "stdio.h"
#include "math.h"
main()
{ int a,b,c,d;
  scanf("%d",&a);
  for(b=3;b<=a/2;b+=2)
  { for(c=2;c<=sqrt(b);c++)
  if(b%c==0) break;
  if(c>sqrt(b))
    d=a-b;
  else
    break;
  for(c=2;c<=sqrt(d);c++)
  if(d%c==0) break;
  if(c>sqrt(d))
    printf("%d=%d+%d\n",a,b,d);
  }
}

题目34:推断一个素数能被几个9整除

1.程序分析:
2.程序源码:
main()
{ long int m9=9,sum=9;
  int zi,n1=1,c9=1;
  scanf("%d",&zi);
  while(n1!=0)
  { if(!(zi/sum)) /*若整数a除以非零整数b。商为整数。且余数为零, 我们就说a能被b整除(或说b能整除a),记作b|a。注意b为0则不叫整除。*/
     n1=0;
    else
    {m9=m9*10;
     sum=sum+m9;
     c9++;
     }
   }
    printf("%ld,can be divided by %d \"9\"",sum,c9);
}

题目35:某个公司採用公用电话传递数据,数据是四位的整数。在传递过程中是加密的,加密规则例如以下:

   每位数字都加上5,然后用和除以10的余数取代该数字。再将第一位和第四位交换。第二位和第三位交换。
1.程序分析:
2.程序源码:
main()
{int a,i,aa[4],t;
  scanf("%d",&a);
  aa[0]=a%10;
  aa[1]=a%100/10;
  aa[2]=a%1000/100;
  aa[3]=a/1000;
  for(i=0;i<=3;i++)
  {aa[i]+=5;
   aa[i]%=10;
  }
  for(i=0;i<=3/2;i++)
  {t=aa[i];
   aa[i]=aa[3-i];
   aa[3-i]=t;
  }
  for(i=3;i>=0;i--)
    printf("%d",aa[i]);
}


题目36:海滩上有一堆桃子,五仅仅猴子来分。第一仅仅猴子把这堆桃子凭据分为五份。多了一个,这仅仅

   猴子把多的一个扔入海中,拿走了一份。第二仅仅猴子把剩下的桃子又平均分成五份,又多了
   一个,它相同把多的一个扔入海中,拿走了一份,第三、第四、第五仅仅猴子都是这样做的,
   问海滩上原来最少有多少个桃子?
1.程序分析:
2.程序源码:

main()
{
    int i,m,j,k,count;
    for(i=4;i<10000;i+=4)
    { 
      count=0;
      m=i;
      for(k=0;k<5;k++)
      {
       j=i/4*5+1;
       i=j;
       if(j%4==0)
        count++;
       else
        break;
      }
     i=m;
     if(count==4)
     {
       printf("%d\n",count);
      break;
      }
    }
}

题目37:有n个人围成一圈。顺序排号。

从第一个人開始报数(从1到3报数)。凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

1. 程序分析:
2.程序源码:

#define nmax 50
main()
{
  int i,k,m,n,num[nmax],*p;
  printf("please input the total of numbers:");
  scanf("%d",&n);
  p=num;
  for(i=0;i<n;i++)
   *(p+i)=i+1;
   i=0;
   k=0;
   m=0;
 while(m<n-1)
 {
   if(*(p+i)!=0) k++;
   if(k==3)
   { *(p+i)=0;
     k=0;
     m++;
   }
    i++;
    if(i==n) i=0;
  }
  while(*p==0) p++;
    printf("%d is left\n",*p);
}

题目38:递归前n项积

1. 程序分析:
2.程序源码:

int fac (int n)
{
   if(n==1)
   return 1;
   return n*fac(n-1);
}

题目39:移除同样字符串

1. 程序分析:
2.程序源码:

        public static string RemoveExtraCharAndWithoutSort(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return null;
            }
            int[] tempArr = new int[256];

            string newStr = string.Empty;
            for (int i = 0; i < str.Length; i++)
            {
                if (tempArr[str[i]] == 0)
                {
                    tempArr[str[i]] = 1;
                    newStr += str[i];
                }
            }

            return newStr;
        }

题目40:倒数第m个节点

1. 程序分析:相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素也仅仅能
从头到尾进行查找,在查找的过程中,设定两个指针。当中current指针指向当前訪问的节点。
 previous指针指向current之前的节点,且两者之间相距m个节点。这样,当current指针指向最后
一个节点时。那previous指针指向的元素就是倒数第m个元素,程序的处理步骤例如以下:
2.程序源码:

   element *CLinkList::FindMToLastElement(int m)
    {
         element *previous, *current;
         previous = current = head;
         // 訪问前m-1个节点
        for(int i = 0; i < m-1; ++i)
        {
           current = current->next;
          if(current == NULL)
          {
             printf("number overstep\n");
             return NULL;
          }
       }
       //previous指针和current指针一起向尾移动
       while(current->next != NULL)
       {
          previous = previous->next;
          current = current->next;
       }
       //返回previous指针
       return previous;
    }


posted on 2016-02-25 14:15  gcczhongduan  阅读(219)  评论(0编辑  收藏  举报