算法(一) 算法初步
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.
- 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;
}