算法(一) 算法初步

算法(一) 算法初步

1. 十进制转为二进制(除二取余法)

	简单的求值方法: 

给出一个数字x,求x十进制各位相加的和
(将它转化为二进制呢?)
temp=1;
while(x>0){
ans+=x%10;
x/=10;
temp*=10;
}
整个过程分为:记录,剪切数位,记号修改三部分
这里,temp指代操作的位数(值是10的乘方)
如果是二进制,循环里的10全部修正为2即可
如果是对temp有要求的其他数据,在记录区域内写相应代码即可

问题2010 题目描述

A市的工人们天天抱着脑袋,因为食品生产线上,他们用0和1来表示是否添加原料,而原料的种类,总计多达20种……
更头疼的是,电路板上的数位,对于工人来说是一个不小的难题。电路板上的LED屏幕总是把0和1的数据,转化成一个十进制的数,于是每次,工人们就会天天计算12039这种数字的二进制位,这让工人们很头疼
对于一个数字x(0<x<1000000),我们想要将它化成简单二进制数相加的形式,7=4+2+1,43=32+8+2+1,这样的一个小工具对于在电路板上头疼的工人来说好像非常有用,因为他们在之前的头疼训练中已经背会了2从0到20的乘方……
输入
一个数字x,表示LED屏幕的数字
输出
一个等式,x=Ei+Ej+Ek+…+E0,其中,Ei,Ej,Ek….是从大到小的2的乘方
样例输入
43
样例输出
43=32+8+2+1

#include<iostream>
using namespace std;
int main()
{
	int n,a[30],k=0,i,c=1,num;
	cin>>n;
	num=n;
	while(n!=0)
	{
		if(n%2!=0) //转化为二进制后这一位是1的话
		{
			a[k++]=c;  //将1乘当前位数
		}
		n=n/2;
		c=c*2;  //c到下一位
	}
	cout<<num<<"=";
	for(i=k-1;i>0;i--)
		cout<<a[i]<<"+";
	cout<<a[0];
}

2.

  1. switch语句有很多的缺陷, 大部分的情况下,使用if else的结构能获得很多好处:
    if
    else if
    else if

    else
    不会漏写break ,只会执行其中一条if分支, 能实现复杂逻辑.

3.模拟

问题2015

题目描述
晾衣服的机器会晾几件衣服,衣服的长度题目给出。
衣服之间晾晒,要隔开一格来作为空位。这个环形的架子,按下按钮会晾干放上的衣服。下面需要依次晾干几件长度不一的衣服,请你给出某个格子的使用情况。
输入
第一行一个数n,表示晾衣架的长度。(n<100000)
接下来有若干数据,每条数据第一行若干个数(数据保证不会占满n),表示衣服的长度
第二行一个数 i,表示要查询 i 位置的使用情况
输出
输出第x位置格子的状态
对于每个数据,使用0表示未使用,1表示有衣服,2表示格子用于隔开衣服。
样例输入
50
2 33 2
34
3 25 2 1
50
样例输出
2
0

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int l,i,j,n,m,a[100055],x,k;
	cin>>l; //衣架长度
	while(cin>>n) //衣服个数
	{
		for(k=0;k<l;k++) //初始化数组
			a[k]=0;
		int position=0;
		for(i=0;i<n;i++)
		{
			cin>>m; //输入衣服长度
			for(j=0;j<m;j++)
			{
				a[position]=1;
				position++;
			}
			a[position++]=2;
		}
		cin>>x;
		if(a[x-1]==0) cout<<0<<endl;
		else if(a[x-1]==1) cout<<1<<endl;
		else if(a[x-1]==2) cout<<2<<endl;
	}
	return 0;
}

发布了10 篇原创文章 · 获赞 7 · 访问量 336

猜你喜欢

转载自blog.csdn.net/weixin_44026026/article/details/103929866