Spoj LastDigit错误答案

时间:2014-01-23 12:58:13

标签: c digits

链接到问题 Spoj LastDigit problem

我已经在我的机器上测试了我的代码但是在SPOJ中它显示错误的答案。 这是我的代码 -

#include<stdio.h>
int main()
{
 int num=0;
 scanf("%d",&num);
 while(num--)
 {      
  int a=0;
  unsigned long int b;
  scanf("%d\t%lu",&a,&b);
  a%=10;
  b%=100;
  if(a==0||a==1)
    printf("%d\n",a);
  else if(b==0)
    printf("1\n");
  else if(a==5)
    printf("5\n");
  else
  {
    int d=b%4,e=1;
    while(d--)
      e*=a;     
    printf("%d\n",e%10);        
  }
 }
 return 0;
}

3 个答案:

答案 0 :(得分:5)

你的程序有问题。您假设除了0,1,5之外的所有数字的长度为4的周期。这是不正确的

例如,考虑输入

1
2 4

你的节目输出

1
而答案应该是权力的最后一位数(2,4)=最后一位数16 = 6

答案 1 :(得分:2)

在SPOJ中,你得到一个WA,因为你的程序用来计算不是那么大数字的最后一位数。在这个问题中,清楚地提到了&#39; b&#39;位于&#39; 0&#39;和&#39; 2,147,483,000&#39;包括的。 解决问题的正确方法是使用Modular Exponentiation。

答案 2 :(得分:0)

  @ Wasim Thabraze I used the modular approach but my solution is not accepted because           
  my solution is taking more than than 700bytes
  #include<iostream>
  using namespace std;
  int lastdigit(int a,long int b);
  int main()
  {
  int t,a;
  long int b;
  cin>>t;
  while(t--)
  {
  cin>>a>>b;
  cout<<lastdigit(a,b)<<"\n";
  }
  return 0;
  }
  int lastdigit(int a,long int b)
  {     if(b==0){return 1;}
  if(a%10==0){return 0;}
  if(a%10==1){return 1;}
  if(a%10==5){return 5;}
  if(a%10==6){return 6;}
  int ret,mod=b%4;
  if(a%10==2||a%10==8||a%10==4)
  {  
   if(a%10==8){if(mod==1){mod=3;}else if(mod==3){mod=1;}}
   if(a%10==4){if(mod==1||mod==3){mod=2;}else if(mod==2){mod=0;}}
   if(mod==1){ret= 2;}
   else if(mod==2){ret =4;}
   else if(mod==3){ret =8;}
   else if(mod==0){ret= 6;}
  }
  else if(a%10==3||a%10==7||a%10==9)
  {   
    if(a%10==7){if(mod==1){mod=3;}else if(mod==3){mod=1;}}
    if(a%10==9){if(mod==1||mod==3){mod=2;}else if(mod==2){mod=0;}}
    if(mod==1){ret= 3;}
    else if(mod==2){ret= 9;}
    else if(mod==3){ret= 7;}
    else if(mod==0){ret= 1;}
  }

  return ret;
  }