1222.cpp

来自「求n!的最低位不是0的数.用到数学规律和mod」· C++ 代码 · 共 123 行

CPP
123
字号
/*
一个数的阶乘(除了0和1)肯定是偶数,1*2*3*4*6*7*8*9%10=6
提出5的倍数单独处理,变成5^n*(1*2*3*4*5........)而且2的倍数一定比5的多.
乘5就等于乘10除2,乘10对我们的结果没有影响,考虑除2,记住末尾是偶数;
所以2 / 2 = 6;
    4 / 2 = 2;
    6 / 2 = 8;
    8 / 2 = 4;  
 
1.求n的最低位的数,确定m 
2.求n中包含几个5的倍数:5,10,15,20........n/5;
3.看(n/5)%4为多少(只与n/5的最后2位有关系); 因为m/2只可能是2,4,6,8周期为4的循环
4.再次确定m(根据第3点)
5.一直求到n<10; 
*/
#include<iostream>
#include<cstring>
using namespace std;

int start,len,mm[150];
char n[110];



int main()
{

char ch;
int m,i,last,m4,add,number,nonzero;

while(cin>>n)
{
len = strlen(n);

//cout<<start<<len<<endl;  //add

//nonzero = f(n);
start = 0;
number = 0;
while(len - start > 1)
 { last = n[len - 1] - 48;
          switch(last)
          { case 0:
            case 1:
            case 3:
            case 9: {m = 6;break;}
            case 2: {m = 2;break;}
            case 4:
            case 5:
            case 6:
            case 8: {m = 4;break;}
            case 7: {m = 8;break;}
          }
         if((n[start] - 48) / 5 == 0)
         {
             ch = n[start];
             n[start] = '0';
             start++;
             n[start] += (ch - 48)*10;
         }
		 add = 0;
         for(i = start;i < len;i++)
         {
             ch = (n[i] - 48 + add * 10) / 5 + 48;
             add = (n[i] - 48) % 5;
			 n[i] = ch;
         }
         m4 = (n[len - 2] - 48) * 10 + (n[len - 1] - 48);
         m4 %= 4;
         if(m == 2)
         {switch(m4)
          {case 0: {m = 2;break;}
           case 1: {m = 6;break;}
           case 2: {m = 8;break;}
           case 3: {m = 4;break;}
          }
         } else if(m == 4)
                { switch(m4)
                 {case 0: {m = 4;break;}
                  case 1: {m = 2;break;}
                  case 2: {m = 6;break;}
                  case 3: {m = 8;break;}}
                } else if(m == 6) 
                       { switch(m4)
                         {case 0: {m = 6;break;}
                          case 1: {m = 8;break;}
                          case 2: {m = 4;break;}
                          case 3: {m = 2;break;}}
                       }else {switch(m4)
                               {case 0: {m = 8;break;}
                                case 1: {m = 4;break;}
                                case 2: {m = 2;break;}
                                case 3: {m = 6;break;}}
                             }
  mm[number] = m;
  number++;                           
         
 }
   switch(n[start] - 48)
     {case 0:
      case 1: {mm[number] = 1;break;}
      case 2:
      case 5:
      case 6:
      case 8: {mm[number] = 2;break;}
      case 3: {mm[number] = 6;break;}
      case 4:
      case 7: {mm[number] = 4;break;}
      case 9: {mm[number] = 8;break;}
     }

nonzero = 1;   
for(i = 0;i <= number;i++)
   nonzero = nonzero * mm[i] % 10;

cout<<nonzero<<endl;

}

return 0;
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?