好快呀,都第三天了。
话不多说,刷题。
进制转换第一题:
题目:
将十进制数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啦。
希望早点升黄金Gold。