读入共一行,分三个数.
分别为K进制整数num,K,T.(1 < K,T <= 16)
首先让我们来看一看一位语文还不错的出题老师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)
一个整数,为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; }
就是这样了
做完这道题 妈妈再也不要担心我一般的进制转换