考研机试第二天

3.整除问题(难题)

问题4:两个整数n(2<=n<=1000),a(2<=n<=1000),求最大的k,使 n! 可以被 a^k 整除,但不能被a^(k+1)整除

#include<stdio.h>
#include<string>
bool mark[1010];
int prime[1010];
int primeSize;
void init(){                        //筛出0到1000内所有的素数
     primeSize = 0;
     for(int i = 2;i <= 1000;i++){
        if(mark[i]) continue;
        mark[i] = true;
        prime[primeSize++] = i;
        for(j = i*i;j <= 1000;j += i){
           mark[j] = k;
        }
     }
  } 
  int cnt[1010];//表示素因子prime[i]对应的幂指数,可能为0
  int cnt2[1010];//prime[i]所保存的素数在a中的因子数
  int main(){
      int n,a;
      init(){
          while(scanf("%d%d",&n,&a) == 2){
               for(int i = 0;i < primeSize;i++){
                  cnt[i] = cnt2[i] = 0;           //两个计数器清零
               for(int i = 0;i < primeSize;i++){ //对n!分解素因数
                  int t = n;                    //临时变量t保存n的值
                  while(t){                  //确定素数prime[i]在n中的因子数
                       cnt[i] += t/prime[i];
                       t = t/prime[i];
                  }
               }
               int ans = 123123123;
               for (int i = 0;i< primeSize;i++){  //对a分解素因数
                   while(a % prime[i] == 0){    
                        cnt2[i] ++;
                        a /= prime[i];
                   }
                   if(cnt2[i] == 0) continue;
                   if(cnt[i] / cnt2[i] < ans){ //计算素数prime[i]在两个数中因子数的商
                      ans = cnt[i] / cnt2[i];//统计这些商的最小值
               }
               printf("%\n",ans);//该商即为所求
           }
           return 0;
       }
  

4.二分求幂

问题5:求A^B的最后三位数表示的整数。说明:A ^B的含义是“A的B次方”。1<=A,B<=10000

```c
#include<stdio.h>
int main(){
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF){
         if(a = 0 && b == 0)  break;
         int ans = 1;//保存最终结果变量
         while(b!=0){
              if(b%2 == 1){//若当前二进制位为1,需累乘a的2^k次至变量ans,其中2^k次为当前二进制位的权重
                ans *= a;
                ans %= 1000;//求最终三位数
              }
              b /= 2;//求下一位二进制位的权重
              a *= a;
              a %= 1000;
         }
         printf("%d",ans);
         }
         return 0;
         }
         ```

5.高精度整数

问题6:实现一个加法器,使其能够输出a+b的值(2010华科)

#include<staido.h>
#include<string.h>
struct bigInteger{
       int digit[1000];
       int size;
       void init(){
            for(int i=0;i<1000;i++){
               digit[i] = 0;
               size = 0;
            }
       }
       void set(char str()){
            init();
            int L = strlen(str);
            for(int i = L-1,j = 0,t = 0,c = 1;i >= 0;i--){
 //j控制每4个字符转换成一个数字存入数组,t临时保存字符转换为数字的中间值,c表示当前位的权重,按1,10,100,1000顺序变化
            t += (str[i] - '0')*c;//计算这个四位数中当前字符代表的数字(数字乘当前位权重)
            j++;
            c *= 10;
            if(j==4||i==0){//若已经连续转换4个字符,或者已经达到最后一个字符
               digit[size++] = t;//四位数存入数组
               j = 0;
               t = 0;
               c = 1;
            }
         }
       }
       void output(){
            for(int i = size -1;i >= 0;i--){
                if(i != size - 1;) printf("%04d",digit[i]);//若当前输出的数字不是最高位数字,用%04的输出前导0,即当前数字不足4位时由0补充,如输出110001的后四位数
                else printf("%d",digit[i]);
            }
            printf("\n");
       }
       bigInteger operator + (const bigInteger &A) const{
          bigInteger ret;
          ret.init();
          int carry = 0;//进位
          for(int i = 0;i < A.size || i<size;i++){
             int tmp = A.digit[i] + digit[i] + carry;//两个整数当前位以及来自低位的进位和
             carry = tmp/10000;
             tmp %= 10000;      //去除进位部分,取后四位
             ret.digit[ret.size++] = tmp;
         }
         if(carry!=0){//计算完后最高位有进位
           ret.digit[ret.size++] = carry;
         }
         return ret;
      }
   }a,b,c;
   char str1[1002],str2[1002];
   int main(){
       while(scanf("%s%s",str1,str2)!=EOF){
            a.set(str1);
            b.set(str2);
            c = a+b;
            c.output();
       }
       return 0;
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值