强行刷段位第三天

好快呀,都第三天了。

话不多说,刷题。


进制转换第一题:

题目:

将十进制数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;
}

明天的递归要加油哇。

今天就到这里吧

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值