1105: 坑爹的进制转换
对于负数进制转换道理和正数是相同的,但是根据样例可以发现对于余数是负数需要特殊处理。这是可以自然想到将余数+进制的绝对值,然后让商值加1(可以自己在纸上推算一下-2进制和-8进制的情况)。还要注意一下当余数大于9以后10-16分别对于A-F(结果使用字符型数组保存)。除数为0的情况特判一下;代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int n,r;
char a[10001];//字符型数组,保存转换后的结果
void fun(int n,int r)
{
int yushu;
int i=0;
if(n==0)//特判,除数为0,转换进制后结果依然是0
a[i++]='0';
while(n!=0)
{
yushu=n%r;//辗转相除
n = n/r;
if(yushu>=0) a[i]=yushu;
else
{
a[i]=yushu+abs(r);//绝对值函数
n++;//商值加一
}
if(a[i]>9) a[i]=(a[i]-10)+'A';
else a[i]=a[i]+'0';
i++;
}
}
int main()
{
int i;
while(scanf("%d %d",&n,&r)==2)
{
fun(n,r);
int len=strlen(a);//字符串长度
reverse(a,a+len);//字符串翻转函数,当然也可以使用循环
cout<<a<<endl;
memset(a,0,sizeof(a));//字符串清0,很重要
}
return 0;
}
1256: 核电站问题
递推打表找规律,看似很难其实很简单。话不多说上代码。
#include<iostream>
using namespace std;
unsigned long long dt(int n)
{
int f;
if(n==0)f=1;
else if(n<3)f=2*dt(n-1);
else if(n==3)f=7;
else f=2*dt(n-1)-dt(n-4);//注意这里
return f;
}
int main()
{
int n;
while(cin>>n&&n!=EOF)
{
cout<<dt(n)<<endl;
}
}
1338 排他平方数
这道题纯暴力,比如这样:
//假设每个位的数字是变量a,b,c,d,e,f
a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&b!=c&&b!=d&&......
或者这样:
#include<iostream>
#include<cstring>
using namespace std;
int vis[10];
int judge(long long i)
{
while(i)
{
if(vis[i%10]==0) vis[i%10]++;
else return 0;
i/=10;
}
return 1;
}
int judge1(long long i)
{
while(i)
{
if(vis[i%10]!=0) return 0;
i/=10;
}
return 1;
}
int main()
{
long long i;
for(i=123456;i<=987654;i++)
{
memset(vis,0,sizeof(vis));
if(!judge(i)) continue;
if(!judge1(i*i)) continue;
cout<<i<<endl;
}
return 0;
}
找到之后直接输出结果就好了。
1008 公约公倍
签到题,没什么好说的。。