pku 1152 An Easy Problem!

题意:输入一个数问这个数是在2-64进制中 哪个进制下的最大值。

算法思路:(来源discuss讨论区)

  设输入的是abcd,假设其解是n进制,则有
   (a*n*n*n + b*n*n + c*n + d)%(n-1)=0
则有:( (a*n*n*n)%(n-1)+ (b*n*n)%(n-1)+ (c*n)%(n-1)+   d  )%(n-1)=0
则有:(  (a* (n%(n-1)) *(n%(n-1)) *(n%(n-1)))+ (b* (n%(n-1)) *(n%(n-1)))+(c* (n%(n-1) +d ) %(n-1)=0
则有: (a*1*1*1+b*1*1+c*1+d)%(n-1)=0
则有:(a+b+c+d)%(n-1)=0

注意:

If number with such condition is not possible output the line "such number is impossible!" For each line of input there will be only a single line of output. The output will always be in decimal number system.(有可能是没有结果的情况)

代码:

#include <stdio.h>
#include <string.h>
char a[30005];
int main()
{
 
 int i,len,f,flag;
 __int64 sum;
 while( scanf("%s",a)!=EOF )
 {
  len=strlen(a);
  sum=0;
  f=1;//记录的是在该数字中每个位置中最大的数字,比如:15 你算出的最大的进制为4,但是显然是不正确的答案。
  for(i=0;i<len;i++)
  {
   if( a[i]>='0' && a[i]<='9' )
   {
    sum=sum+(a[i]-'0');
    if( a[i]-'0'>f )
     f=a[i]-'0';
   }
   else if( a[i]>='A' && a[i]<='Z' )
   {
    sum=sum+(a[i]-55);
    if( a[i]-55>f )
     f=a[i]-55;
   }
   else
   {
    sum=sum+(a[i]-61);
    if( a[i]-61>f )
     f=a[i]-61;
   }
  }
  flag=1;
  for(i=2;i<=62;i++)
  {
   if( sum%(i-1)==0 && i>f )
   {      
    flag=0;
    printf("%d/n",i);
    break;
   }
  }
  if( flag )
   printf("such number is impossible!/n");
 }
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值