首先让我们来看一看一位语文还不错的出题老师llq的最新作品
1.在银河系中有好多有着高等生物的类地球星球,α星球和β星球就是其中的两个,这两个星球每年都
会派出大使互通货物,α大使和β大使会先带着货物都到达位于中间的γ星球交换货物,如果α大使带的
货物更值钱,β大使需要再付相差的β币,如果β大使带的货物更值钱的话,α大使需要再付相差的α币。
请帮助α大使和β大使计算出,需要付的相差的币值,如果货物等价则输出0。
【输入】
输入三行,第一行有两个整数:α星球的货币进制A 和β星球的货币进制B(2 <= A,B <= 16)
第二行为α大使所带货物的价值(α进制数)
第三行为β大使所带货物的价值(β进制数)
【输出】
输出为一行,需要付给对方的相差(α或β)币值。
样例
in
16 8
1046A
4035
out
175515
对于第一个题,本人表示十分无语 ,,,,,这不就是一道及其麻烦的进制转换吗?????然而为了不辜负老师的希望 ,我决定一试
于是我用手一下一下敲出了 这么一大坨代码
#include <stdio.h>
#include <ctype.h>
#include <string.h>
long long pow(int a,int b)
{
if(b==0)
return 1;
long long c= pow(a,b/2);
if(b%2==0)
return c*c;
else
return c*c*a;
}
int main()
{
freopen("goods.in","r",stdin);
freopen("goods.out","w",stdout);
char c2n[256];
for(int i=65;i<=71;i++)
{
c2n[i]=i-55;
}
char n2c[256];
for(int i=10;i<=16;i++)
{
n2c[i]=i+55;
}
int a;
int b;
scanf("%d%d",&a,&b);
char str1[10000];
char str2[10000];
scanf("%s",str1);
scanf("%s",str2);
int m=strlen(str1);
int n=strlen(str2);
int aa[1000]={};
int bb[1000]={};
for(int i=0;i<m;i++)
{
if(isdigit(str1[i]))
{
aa[i]=str1[i]-48;
}
if(isalpha(str1[i]))
{
aa[i]=c2n[str1[i]];
}
}
for(int i=0;i<n;i++)
{
if(isdigit(str2[i]))
{
bb[i]=str2[i]-48;
}
if(isalpha(str2[i]))
{
bb[i]=c2n[str2[i]];
}
}
long long sum1=0;
long long sum2=0;
for(int i=0;i<m;i++)
{
sum1+=aa[i]*pow(a,m-i-1);
}
for(int i=0;i<n;i++)
{
sum2+=bb[i]*pow(b,n-i-1);
}
if(sum1>sum2)
{
long long tmp=sum1-sum2;
int tmp1[1000];
int k=0;
while (tmp/b!=0)
{
tmp1[k]=tmp%b;
tmp/=b;
k++;
}
tmp1[k]=tmp;
for(int i=k;i>=0;i--)
{
if(tmp1[i]<10)
printf("%d",tmp1[i]);
if(tmp1[i]>=10)
printf("%c",n2c[tmp1[i]]);
}
}
if(sum1==sum2)
{
printf("0");
}
if(sum1<sum2)
{
long long tmp=sum2-sum1;
int tmp1[1000];
int k=0;
while (tmp/a!=0)
{
tmp1[k]=tmp%a;
k++;
tmp/=a;
}
tmp1[k]=tmp;
for(int i=k;i>=0;i--)
{
if(tmp1[i]<10)
printf("%d",tmp1[i]);
if(tmp1[i]>=10)
printf("%c",n2c[tmp1[i]]);
}
}
fclose (stdin);
fclose (stdout);
return 0;
}
童鞋们 你们知道么。。。。。。
我打完这么一大坨后,整个人都不好了
所以...................
这道题有坑!!!!
你们造么
他说不爆longlong
是十进制!!!!!!
而我们就天真的以为他仅仅会有longlong的位数
而
十进制换成二进制
会有N多位
当你天真的char【40】的时候 你仅仅会有二十分 狡黠的llq竟然有一个测点是 2 16 1 7FFFFFFFFFFFFFFF
天啊
于是我机智的换了数字 。。。。。。
在经历了近一个小时的努力 成功了
现在为大家呈上标称 用函数来实现 c2n n2c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
typedef long long LL;
LL calc(char *s, int K)
{
int L = strlen(s);
LL e = 1, ans = 0;
for(int i=L-1; i>=0; i--, e*=K)
if(isdigit(s[i]))
ans += e*(s[i]-'0');
else
ans += e*(toupper(s[i])-'A'+10);
return ans;
}
void output(LL x, int T)
{
int d[100] = {}, L = 0;
do
{
d[L++] = x%T;
x /= T;
}
while(x);
for(int i=L-1; i>=0; i--)
if(d[i] < 10) printf("%d", d[i]);
else putchar(d[i]-10+'A');
puts("");
}
int main()
{
freopen("goods.in","r",stdin);
freopen("goods.out","w",stdout);
char str[100];
int Ka, Kb;
LL a, b;
scanf("%d%d", &Ka, &Kb);
scanf("%s", str);
a = calc(str, Ka);
scanf("%s", str);
b = calc(str, Kb);
if(a > b) output(a-b, Kb);
else output(b-a, Ka);
return 0;
}
简洁了不少 不愧叫标称!~!!!!
其实 进制转换 如果没有什么好方法 一坨一坨的代码按照定义顺下来就可以了
孩纸们
现在呈上纯纯的进制转换
为各进行参考
读入共一行,分三个数.
分别为K进制整数num,K,T.(1 < K,T <= 16)
Output
一个整数,为T进制下的该数.
看看我的代码
#include <stdio.h>
#include <string.h>
#include <ctype.h>
long long pow(int a,int b)
{
if(b==0)
return 1;
long long c= pow(a,b/2);
if(b%2==0)
return c*c;
else
return c*c*a;
}
int main()
{
char c2n[256];
for(int i='A';i<='F';i++)
{
c2n[i]=i-55;
}
char n2c[256];
for(int i=10;i<=16;i++)
{
n2c[i]=i+55;
}
char str[100];
scanf("%s",str);
int a;
int b;
scanf("%d%d",&a,&b);
int m=strlen(str);
long long sum=0;
int aa[100];
for(int i=0;i<m;i++)
{
if(isalpha(str[i]))
{
aa[i]=c2n[str[i]];
}
if(isdigit(str[i]))
{
aa[i]=str[i]-48;
}
}
for(int i=0;i<m ;i++)
{
sum+=aa[i]*pow(a,m-i-1);
}
int bb[100];
int k=0;
while(sum/b!=0)
{
bb[k]=sum%b;
k++;
sum/=b;
}
bb[k]=sum;
for(int i=k;i>=0;i--)
{
if(bb[i]<10)
{
printf("%d",bb[i]);
}
if(bb[i]>=10)
{
printf("%c",n2c[bb[i]]);
}
}
return 0;
}
就是这样了
做完这道题 妈妈再也不要担心我一般的进制转换