好快呀,都第三天了。
话不多说,刷题。
进制转换第一题:
题目:
将十进制数n转换成m进制数 m<=16
n<=100
输入描述:
共一行
n和m
输出描述:
共一个数
表示n的m进制
样例输入:
样例1:10 2
样例2:100 15
样例输出:
样例1:1010
样例2:6A
数据范围及提示:
用反向取余法
我的答案:
发现进入白银的题目之后就是系统的刷题了,各种类型的基础题都来两道。
这种感觉很好,系统而有趣味。
一种类型两道,一天一个类型。有余力(变身乌龟的时候)的话可以再做一个类型。进度不紧不慢刚刚好。
这么看起来离完成白银也不是那么的远了。
本题用到了除k取余法。要注意凡是大于9的数字都要用ABC什么的代替,万万不能搞一个两位数在那明晃晃的挂着。
自己总是在语法细节上遗忘,要记住本题的方式。
char arr[8];
if(n<10) arr[top]='0'+n;
else arr[top]='A'+n-10;
要注意:1.C语言中,字符的存储就是按其ASCII值(整数)进行存储的
2.用单引号取出其ASCII码,不加单引号自动输出ASCII对应的字符
代码如下:
#include <iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
char arr[8];
int top=-1;
int temp=0;
while(n!=0)
{
temp=n/m;
top++;
if(n%m<10) arr[top]='0'+n%m;
else arr[top]='A'+n%m-10;
n=temp;
}
while(top>=0)
{
cout<<arr[top];
top--;
}
return 0;
}
进制转换第二题:
问题:
将m进制数n转化成一个十进制数 m<=16
题目保证转换后的十进制数<=100
输入描述:
共一行
n和m
输出描述:
共一个数
表示m进制的n化成十进制的数
样例输入:
1010 2
样例输出:
10
数据范围及提示:
乘权累加法
我的答案:
这题看似只是上一题的反过程,其实要比上一题复杂一些。在累乘过程中要慎重。行数也不多,20行足够完成。
这题学到的同样是语法问题。
1.以前上课那会儿字符串和数组就学的不扎实。字符串本质和char类型的数组是相同的,所以字符串也是可以用n[3]来表示字符串中第四个字符的。
2.另外,可以include<string.h>,利用strlen()来获得字符串长度,方便接下来的循环条件的书写。
代码如下:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int m;
char n[8];
cin>>n>>m;
int len=strlen(n);
int res=0;
for(int i=0;i<len;i++)
{
if(n[i]>='0' && n[i]<='9')
res=res*m+n[i]-'0';
else if(n[i]>='A' && n[i]<='F')
res=res*m+n[i]-'A'+10;
}
cout<<res;
return 0;
}
还剩一个递推,一个递归。
递归的两道题感觉不是很难。递归的题目有5道,正好我的递归不熟练,可以好好练。里面有很多经典的问题,包括树和汉诺塔等等。
感觉再有个三天就能完成白银Silver啦。
希望早点见到黄金题。
下午了,又想来两道。那就来两道吧~
递推第一题:
题目:
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入描述:
一个数n
输出描述:
满足条件的数的个数
样例输入:
6
样例输出:
6
数据范围及提示:
6个数分别是:
6
16
26
126
36
136
我的答案:
。。。
又麻烦了Kevin。。。
DEVC++上运行结果都是正确的,到了codevs上就不行。。。
Kevin略略一看就知道我的sum没赋初值。。。
果然我还是太嫩了。
以后要记得赋初值啊赋初值!!!不然鬼知道你一阵操作之后得了个什么鬼结果。。
代码:
#include <iostream>
using namespace std;
void num(int n,int &sum)
{
if(n>1)
{
sum=sum+n/2;
for(int i=0;i<=n/2;i++)
{
num(i,sum);
}
}
}
int main()
{
int n=0;
cin>>n;
int sum=1;
num(n,sum);
cout<<sum;
return 0;
}
递推第二题:
题目:
斐波纳契数列是这样的数列:
f1 = 1
f2 = 1
f3 = 2
f4 = 3
....
fn = fn-1 + fn-2
输入一个整数n
求fn
输入描述:
一个整数n, n<= 40
输出描述:
一个整数fn
样例输入:
3
样例输出:
2
数据范围及提示:
n<=40
我的答案:
我觉得以后高段位了还会遇见这一题吧,数据范围应该是会更大的。
肯定有更好的办法。但是懒得改了,以后遇到再说吧。
n特别强调了n<=40,而且这道题标注是青铜段位的,显然模拟一下递推,15行就能解决啦。
代码:
#include <iostream>
using namespace std;
int arr[40]={0};
int main()
{
int i=0,n=0;
cin>>n;
arr[0]=1;
arr[1]=1;
for(i=2;i<40;i++)
{
arr[i]=arr[i-1]+arr[i-2];
}
cout<<arr[n-1];
return 0;
}
明天的递归要加油哇。
今天就到这里吧