看看最新的考试 c语言 noip模拟 纯llq原创作品

首先让我们来看一看一位语文还不错的出题老师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;
}



okok


就是这样了



做完这道题   妈妈再也不要担心我一般的进制转换

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值