Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18427
  • 博文数量: 11
  • 博客积分: 314
  • 博客等级: 二等列兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 12:44
文章分类
文章存档

2012年(11)

我的朋友
最近访客

分类: C/C++

2012-05-26 22:05:21

A、The 3n + 1 problem
题意:输入两个数据分别是上下限,
根据:
if n = 1 then STOP
if n is odd then   n <-- 3n+1
else   n <-- n/2
循环数字,求上下限间循环次数最多的
思路:
使用循环结构,在两数之间找最大的循环次数,1结束
注意:
输入两数间没有确定的大小关系。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. void main()
  3. {
  4.     int i,j,n1,n2=0,a,b,t;    
  5.     while(scanf("%d%d",&a,&b)!=EOF)
  6.     {
  7.         if(a>b)
  8.         {
  9.             {
  10.             t=a;a=b;b=t;
  11.             }
  12.         n1=0;n2=0;
  13.          for(i=a;i<=b;i++)
  14.          {
  15.              n1=0;
  16.              j=i;
  17.              while(j!=1)
  18.              {
  19.      if(j%2==0)
  20.              {
  21.                  j=j/2;
  22.                  n1++;
  23.              }
  24.              else
  25.              {
  26.                  j=3*j+1;
  27.                  n1++;
  28.              }
  29.              }
  30.              n1++;
  31.              if(n2<=n1)
  32.                  n2=n1;
  33.          }
  34.          printf("%d %d %d\n",b,a,n2);
  35.         }
  36.         else
  37.         {
  38.             n1=0;n2=0;
  39.          for(i=a;i<=b;i++)
  40.          {
  41.              n1=0;
  42.              j=i;
  43.              while(j!=1)
  44.              {
  45.      if(j%2==0)
  46.              {
  47.                  j=j/2;
  48.                  n1++;
  49.              }
  50.              else
  51.              {
  52.                  j=3*j+1;
  53.                  n1++;
  54.              }
  55.              }
  56.              n1++;
  57.              if(n2<=n1)
  58.                  n2=n1;
  59.          }
  60.          printf("%d %d %d\n",a,b,n2);
  61.         }
  62.     }
  63. }
B、THE DRUNK JAILER
题意:n个牢房循环n遍,起初都开着,循环过程中将某些牢房开的关了,关的开了,某些牢房跟循环次数有关,是次数的整数倍
思路:输入n,先将数组都赋值为0,表示开,当k次循环时,将整除k的牢房的值变化,以前是0的变为1,以前是1的变为0,最后统计数组中1的个数

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int n,a[200],i,j,k,count=0,b[10000];
  5.     scanf("%d",&n);
  6.     for(i=0;i<n;i++)
  7.         scanf("%d",&b[i]);
  8.     for(k=0;k<n;k++)
  9.     {
  10.         count=0;
  11.      for(i=1;i<=b[k];i++)
  12.         a[i]=0;
  13.      for(i=1;i<=b[k];i++)
  14.      {
  15.         for(j=1;j<=b[k];j++)
  16.         {
  17.             if(j%i==0)
  18.             {
  19.                 if(a[j]==0)
  20.                     a[j]=1;
  21.                 else if(a[j]==1)
  22.                     a[j]=0;
  23.             }
  24.         }
  25.      }
  26.      for(i=1;i<=b[k];i++)
  27.      {
  28.         if(a[i]==1)
  29.             count++;
  30.      }
  31.      printf("%d\n",count);
  32.      }
  33.     
  34.     return 0;
  35. }
C - Quicksum
题意:输入字符串,以回车结束,其quicksum为各个字符的位置乘以它对应的的值之和。
思路:用两个数组,一个记录字符串内容,另一个整型数组记录对应位置字符的大小,将大小*位置加起来即可。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.     char a[300],*p;
  6.     int s=0,i,cnt[300],n;
  7.     while(gets(a) && a[0]!='#')
  8.     {
  9.         s=0;n=0;
  10.         p=a;
  11.         n=strlen(a);
  12.      for(i=0;i<n;i++)
  13.      {
  14.          if(a[i]==' ')
  15.              cnt[i+1]=0;
  16.          else
  17.              cnt[i+1]=a[i]-'A'+1;
  18.      }
  19.      for(i=1;i<=n;i++)
  20.      {
  21.         s=s+i*cnt[i];
  22.      }
  23.      printf("%d\n",s);
  24.      }
  25.     return 0;
  26. }
D - Above Average
题意:求平均值以上数字的百分比
思路:用数组记录各个数据,求和,再求平均值,数组值一一与平均值比较,记录比平均值大的数据个数,除以总数即可。
注意:%号的输出方式是%%。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int a[2000][2000];
  3. int main()
  4. {
  5.     int n,i,no,j;
  6.     float avg,precent;
  7.     scanf("%d",&n);
  8.     for(i=0;i<n;i++)
  9.     {
  10.         avg=0;
  11.         no=0;
  12.         scanf("%d",&a[i][0]);
  13.         for(j=1;j<=a[i][0];j++)
  14.         {
  15.             scanf("%d",&a[i][j]);
  16.          avg=avg+a[i][j];
  17.         }
  18.         avg=avg/a[i][0];
  19.         for(j=1;j<=a[i][0];j++)
  20.         {
  21.             if(a[i][j]>avg)
  22.                 no++;
  23.         }
  24.         precent=(float)no/a[i][0]*100;
  25.         printf("%.3f%%\n",precent);
  26.     }
  27.     return 0;
  28. }

E - 排列
题目描述:
大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排列。

任务描述:
给出某个排列,求出这个排列的下k个排列,如果遇到最后一个排列,则下1排列为第1个排列,即排列1 2 3…n。
比如:n = 3,k=2 给出排列2 3 1,则它的下1个排列为3 1 2,下2个排列为3 2 1,因此答案为3 2 1。
思路:使用数组记录数值,全排列函数排序输出。
注意:函数的使用方法,用c++编程

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <algorithm>
  4. using namespace std;
  5. struct node
  6. {
  7.     int n;
  8.     int k;
  9.     int a[2000];
  10. }node[2000];
  11. int main()
  12. {
  13.     int m,i,j;
  14.     scanf("%d",&m);
  15.     for(i=0;i<m;i++)
  16.     {
  17.         scanf("%d%d",&node[i].n,&node[i].k);
  18.         for(j=0;j<node[i].n;j++)
  19.         {
  20.             scanf("%d",&node[i].a[j]);
  21.         }
  22.         for(j=0;j<node[i].k;j++)
  23.         next_permutation(node[i].a,node[i].a+node[i].n);
  24.         for(j=0;j<node[i].n;j++)
  25.                printf("%d ",node[i].a[j]);
  26.         printf("\n");
  27.     }            
  28.     return 0;
  29. }
F - Soundex
题意:翻译问题,将字符按一定规律翻译成数字,输出无连续重复数字
思路:逐个翻译,使用if判断,翻译后存储在数字数组中,判断输出。
注意:循环结束条件。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char a[21],*p;
  5.     int b[21],n=0,i;
  6.     while(scanf("%s",a)!=EOF)
  7.     {
  8.         n=0;
  9.         p=a;
  10.         while(*p!='\0')
  11.         {
  12.             if(*p=='B' || *p=='F'||*p=='P'||*p=='V')
  13.                 b[n]=1;
  14.             else if(*p=='C'|| *p=='G'||*p=='J'||*p=='K'||*p=='Q'|| *p=='S'||*p=='X'||*p=='Z')
  15.                 b[n]=2;
  16.             else if(*p=='D'|| *p=='T')
  17.                 b[n]=3;
  18.             else if(*p=='L')
  19.                 b[n]=4;
  20.             else if(*p=='M' || *p=='N')
  21.                 b[n]=5;
  22.             else if(*p=='R')
  23.                 b[n]=6;
  24.             else b[n]=0;
  25.             n++;
  26.             p++;
  27.         }
  28.         for(i=0;i<n;i++)
  29.         {
  30.             if(b[i]!=0 && b[i]!=b[i-1])
  31.                 printf("%d",b[i]);
  32.         }
  33.         printf("\n");
  34.     }
  35.     return 0;
  36. }



 
阅读(655) | 评论(0) | 转发(0) |
0

上一篇:第二次训练

下一篇:没有了

给主人留下些什么吧!~~