今天做了4个简单的题,题目虽然是简单,但是对于我这样的小白,还是有很多东西需要学习的。
2的次幂表示
上面就是题目,题目说的也很清晰了,接下来就是递归的实现:
1 #include<iostream> 2 using namespace std; 3 void puts(int n) 4 { 5 int i=0,num=0; 6 int a[20] = {0}; 7 while(1) 8 { 9 if(n==0) break; 10 int temp = n%2; 11 if(temp!=0) 12 { 13 a[num] = i; 14 num++; 15 } 16 i++; 17 n = n/2; 18 } 19 for(i = num-1; i >= 0; i--) 20 { 21 if(a[i]==0) 22 { 23 cout<<"2(0)"; 24 } 25 else if(a[i]==1) 26 { 27 cout<<"2"; 28 } 29 else if(a[i]>=2) 30 { 31 cout<<"2("; 32 puts(a[i]); 33 cout<<")"; 34 } 35 if(i!=0) 36 { 37 cout<<"+"; 38 } 39 } 40 41 } 42 int main() 43 { 44 int n; 45 cin>>n; 46 puts(n); 47 return 0; 48 }
关键是找到应该在哪里递归。
前缀表达式
我们之前说到过后缀表达式,实际上,前缀表达式更符合计算机运算规则。
1 #include<iostream> 2 using namespace std; 3 void add(int a,int b) 4 { 5 cout<<a+b; 6 } 7 void sub(int a,int b) 8 { 9 cout<<a-b; 10 } 11 void mul(int a,int b) 12 { 13 cout<<a*b; 14 } 15 void div(int a,int b) 16 { 17 cout<<a/b; 18 } 19 int main() 20 { 21 char a; 22 int b,c; 23 cin>>a>>b>>c; 24 switch(a) 25 { 26 case '+': 27 add(b,c); 28 break; 29 case '-': 30 sub(b,c); 31 break; 32 case '*': 33 mul(b,c); 34 break; 35 case '/': 36 div(b,c); 37 break; 38 default: 39 break; 40 } 41 return 0; 42 }
Anagrams问题
看到这个问题的时候,首先想到了之前学长教过的,要充分利用下标,最多有26个英文字母。我们开创两个数组,分别存放两个字符串,将英文字母在字母表中的顺序对应数组的下标,是个很不错的选择。
但是我第一次写的时候,使用的是char型数组,一个一个读入,最后发现运行超时,改用字符串读入方法,问题就得以解决了,这就提示我,以后遇到字符串问题,优先考虑字符串处理。
代码如下:
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int trans(char a) 5 { 6 if(a>='a'&&a<='z') 7 { 8 return a-'a'; 9 } 10 if(a>='A'&&a<='Z') 11 { 12 return a-'A'; 13 } 14 } 15 int main() 16 { 17 int num1[26]={0}; 18 int num2[26] = {0}; 19 int flag = 0; 20 char a[81],b[81]; 21 /* while(1) 22 { 23 scanf("%c",&a); 24 if(a==' ') break; 25 num1[trans(a)]++; 26 } 27 while(1) 28 { 29 scanf("%c",&a); 30 if(a==' ') break; 31 num2[trans(a)]++; 32 } */ 33 cin>>a; 34 cin>>b; 35 36 for(int i = 0; i < strlen(a); i++) 37 { 38 num1[trans(a[i])]++; 39 } 40 for(int i = 0; i < strlen(b); i++) 41 { 42 num2[trans(b[i])]++; 43 } 44 for(int i = 0; i < 26; i++) 45 { 46 if(num1[i]!=num2[i]) 47 { 48 flag = 1; 49 cout<<"N"; 50 break; 51 } 52 } 53 if(flag==0) 54 cout<<"Y"; 55 return 0; 56 }
在主函数中有一点注释部分,这就是最初使用的方法。
出现次数最多的整数
设计两个数组,一个存放的就是输入的数据,另一个存放的是对应出现的次数。这里就需要考虑一下,有的数字重复出现,怎么样才能使其实现计数,并且将两个数组实现一一对应。
代码如下:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int num[20] = {0};//存放每个数字 6 int sum[20] = {0};//存放每个数字的个数 7 int n; 8 int i = 0; 9 int j = 0; 10 cin>>n; 11 for(i = 0; i < n; i++) 12 { 13 cin>>num[i]; 14 if(num[i]==num[i-1]) 15 { 16 sum[j-1]++; 17 j--; 18 } 19 j++; 20 } 21 if(j!=0) 22 { 23 int max = 0; 24 for(int j = 0; j < i; j++) 25 { 26 if(sum[j]<sum[j+1]) 27 { 28 max = j+1; 29 } 30 } 31 cout<<num[max]; 32 return 0; 33 } 34 }
关键是这里:
【感想】简单题虽然称之为简单题,但是还是需要练习,绝对不能眼高手低,没有一次100%成功,就说明自己还是修炼不够,需要继续努力。从小处获取经验,慢慢积累,相信自己。