鸡兔同笼问题
注意,脚不是4的倍数的时候最少的动物数,其实就是(N-2)/4+1,只不过这里整形截断了小数部分..
#include "stdio.h"
int main()
{
int nCases,nFeet ,i;
scanf("%d",&nCases);
for(i=0; i<nCases;i++){
scanf("%d", &nFeet);
if(nFeet%2 !=0)
printf("0 0\n");
else if(nFeet%4 != 0)
printf("%d %d\n",nFeet/4+1,nFeet/2);
else
printf("%d %d\n",nFeet/4,nFeet/2);
}
return 0;
}
棋盘距离问题
注意不要忽略后的x==0 和y==0的情况
#include "stdio.h"
#include "math.h"
int main()
{
int nCase;
scanf("%d",&nCase);
char begin[20][2],end[20][2];
for(int i=0;i<nCase;i++)
{
scanf("%s%s",&begin[i],&end[i]);
}
for(i=0; i<nCase;i++)
{
int x,y;
x = abs(begin[i][0]-end[i][0]);//字母
y = abs(begin[i][1]-end[i][1]);//数字
if(x==0 && y==0) printf("0 0 0 0\n");
else
{
if(x<y) printf("%d",y);//王
else printf("%d",x);
if(x==y || x==0 || y==0) printf(" 1");//后
else printf(" 2");
if(x==0 || y==0) printf(" 1");//车
else printf(" 2");
if(abs(x-y)%2 !=0) printf(" Inf\n");//象
else if(x==y) printf(" 1\n");
else printf(" 2\n");
}
}
return 0;
}
校门外的树
主要的问题是怎么存储如果开一个数组,实在是太大,而且不能根据L来调整数组大小,浪费空间。用vector<bool>来存flag值比较节省空间。注意一个反省算法的用法count..
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int L,M,start,end,m,i;
cin>>L>>M;
vector<bool> tree(L+1,true);
for (m=0;m<M;m++) {
cin>>start>>end;
for(i=start;i<=end;i++)
tree[i]=false;
}
cout<<count(tree.begin(),tree.end(),true)<<endl;
return 0;
}
确定进制问题
1.需要注意字符串转十进制数的方法ret = ret*b + x[i]-'0';
2.注意如果在2-16数制中如数字超过进制,返回-1,提前跳出当前循环...
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
long b2ten(string x,int b)
{
long ret = 0;
for(int i=0;i<x.length();i++)
{
if(x[i]-'0'>=b) return -1;
ret = ret*b + x[i]-'0';
}
return ret;
}
int main()
{
int n,b;
string p,q,r;
long pAgr,qAgr,rAgr;
cin>>n;
while(n--)
{
cin>>p>>q>>r;
for(b=2;b<=16;b++)
{
pAgr = b2ten(p,b);
qAgr = b2ten(q,b);
rAgr = b2ten(r,b);
if(pAgr == -1 || qAgr == -1 || rAgr == -1) continue;
if(pAgr * qAgr == rAgr){
cout<<b<<endl;
break;
}
}
}
if(b == 17) cout<<"0"<<endl;
return 0;
}
skew数的问题
挺简单,就是一个数制转换的问题,要把每一个base的基计算出来,要注意base和字符串的对应关系..
#include <iostream>
#include <string>
using namespace std;
int main()
{
int base[31],sum,k;
string skew;
base[0] = 1;
for(int i=1; i<31; i++) base[i]=2*base[i-1]+1;
while(1)
{
cin>>skew;
if(skew == "0")
break;
sum = 0;
k = skew.length();
for(i=0;i<skew.length();i++)
{
k--;
sum += (skew[i]-'0')*base[k];
}
cout<<sum<<endl;
}
return 0;
}
网友评论