本次解题实在是状况不断……有时候有思路但是在编写代码的过程中往往就乱掉了。最后编译出来的时候,往往编译没有错但是结果总是不对。
我觉得是我的限时快速编程经验过少。不集中注意力,思路容易乱,所以编出来能运行的程序,但是程序不能做出相应的功能……
这是大忌。
A - The 3n + 1 problem 解题:
- 我的思路是,先判断i,j大小,如果i>j就把他俩的值调换。然后进行for循环,让循环变量a从i循环到j。
- 预先定义两个变量m,n;在循环中使用。在定义一个变量k,每次循环记下a的值,然后对k进行题目中的操作,每操作一次,累加器m就+1,(m初值为1)。当对k操作完毕时(k==1),m的值就是操作的次数。n的初值也为1,在while循环中。它的目的是记下进行过的for循环中,m出现过的最大值。 if(m>n) n=m; //最后输出也是输出n。
- 因为程序中i和j的值可能有交换,故我定义一个变量flag记下i和j是否进行了交换。(flag==0则他们没有交换过)。若他们交换过,在输出值之前我要再把i,j换回来。
- 以上。
- #include <stdio.h>
- void main(void)
- {
- int i,j,n,m,k,a,flag=0;
- while(scanf("%d%d",&i,&j)!=EOF)
- {
- if(i>j)
- {
- n=i;i=j;j=n;
- flag=1;
- }
- n=1;
- for(a=i;a<=j;a++)
- {
- m=1;
- k=a;
- while(k!=1)
- {
- if((k/2)==((k-1)/2))
- k=3*k+1;
- else
- k=k/2;
- m++;
- }
- if(m>n) n=m;
- }
- if(flag==0)
- printf("%d %d %d\n",i,j,n);
- else
- printf("%d %d %d\n",j,i,n);
- }
- }
B - THE DRUNK JAILER
解题:【逃跑问题】
- 本程序采用动态申请内存的方法申请整型数组。节省空间。
- cha()函数是根据a的值,进行0,1交换。。。
- 这样程序思路就很明显了。
- 输入case个数N之后,就进入while(N--)循环了。
- 首先对数组初始化,值全为1.
- 循环内嵌套for循环(循环变量j从2到n),for循环中对数组进行遍历,对于j的倍数,进行cha()函数的值更新。
- 最后在此遍历数组,用累加器累加出数组内的1值即可。
- #include <stdio.h>
- int cha(int a)
- {
- if(a) return 0;
- else return 1;
- }
- int main()
- {
- int n,i,j,N;
- scanf("%d",&N);
- while(N--)
- {
- scanf("%d",&n);
- int *p=new int[n];
- for(i=0;i<n;i++)
- p[i]=1;
- for(j=2;j<=n;j++)
- {
- for(i=0;i<n;i++)
- if((i+1)%j==0)
- p[i]=cha(p[i]);
- }
- j=0;
- for(i=0;i<n;i++)
- {
- if(p[i])
- j++;
- }
- printf("%d\n",j);
- }
- return 0;
- }
C - Quicksum解题:{这次读题疏忽,这是第一次不应该犯的错误。忽略了值的范围0-255。所以第一次定义为s[30]造成结果错。}
题目思路简单,位置可以通过数字元素下标+1得出,而字母在字母表中的顺序,可以通过相应ASCII码-64转换得出。故此题关键在于怎么回避空格问题。空格值为0,故加一条判断语句跳过空格继续累加即可。
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- char s[300];
- int i,sum=0;
- gets(s);
- while(strcmp(s,"#"))
- {
- sum=0;
- for(i=0;s[i];i++)
- if(s[i]!=' ')
- sum+=(i+1)*(s[i]-64);
- printf("%d\n",sum);
- gets(s);
- }
- return 0;
- }
D - Above Average
解题:
- 首先要注意最后输出格式保留三位小数。 "%.3f%%"。
- 为了尽量减少变量的申请。两个变量conc(最后的百分数)和ave平均数有两个功能。
- 再累加的时候,ave是累加器。最后通过ave/=n得出平均数。
- conc先是表示小数的比例,在最后通过乘以100转化为百分值。
- 以上。
- #include <stdio.h>
- int main()
- {
- int c,n,a[1000],i;
- float conc,ave;
- scanf("%d",&c);
- while(c--)
- {
- scanf("%d",&n);
- ave=0;
- for(i=0;i<n;i++)
- {
- scanf("%d",&a[i]);
- ave+=a[i];
- }
- ave/=n;
- conc=0;
- for(i=0;i<n;i++)
- if(a[i]>ave)
- conc++;
- conc=100*conc/n;
- printf("%.3f%%\n",conc);
- }
- }
E - 排列
解题:第一次遇见中文题~~~XD
- 全排列问题。我再次第二次遇到问题。因为全排列函数第一次碰到。思路完全乱了。
- 当知道全排列函数是可以从头继续排的时候,一切都豁然开朗了。
- #include <stdio.h>
- #include <stdlib.h>
- #include <algorithm>
- int a[1030];
- using namespace std;
- int cmp(const void *a,const void *b)
- {
- return *(int *)a-*(int *)b;
- }
- int main()
- {
- int m,n,i,k;
- scanf("%d",&m);
- while(m--)
- {
- scanf("%d%d",&n,&k);
- for(i=0;i<n;i++) scanf("%d",&a[i]);
- do
- {
- k--;
- }while(next_permutation(a,a+n)&&k);
-
- if(k)
- {
- qsort(a,n,sizeof(a[0]),cmp);
- do
- {
- k--;
- next_permutation(a,a+n);
- }while(k);
- for(i=0;i<n;i++) printf("%d ",a[i]);
- printf("\n");
- }
- else
- {
- for(i=0;i<n;i++) printf("%d ",a[i]);
- printf("\n");
- }
- }
- return 0;
- }
F - Soundex
解题:用子函数,思路会更加清晰。在此我又遇到了问题。return 2;那一句我居然把字母Z忘了。活该做不出来。
- 剩下的思路路都还挺简单的,为了避免数字重复的问题。sound(s[i])!=sound(s[i-1]) 这一句就可以解决。
- 以上。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int sound(char c)
- {
- if(c=='B'||c=='F'||c=='P'||c=='V') return 1;
- if(c=='C'||c=='G'||c=='J'||c=='K'||c=='Q'||c=='S'||c=='X'||c=='Z') return 2;
- if(c=='D'||c=='T') return 3;
- if(c=='L') return 4;
- if(c=='M'||c=='N') return 5;
- if(c=='R') return 6;
- return 0;
- }
- int main()
- {
- char s[25];
- int i;
- while(gets(s))
- {
- for(i=0;s[i];i++)
- {
- if(sound(s[i])&&sound(s[i])!=sound(s[i-1]))
- {
- printf("%d",sound(s[i]));
- }
- }
- printf("\n");
- }
- }
阅读(674) | 评论(0) | 转发(1) |