HDU 4485 B-Casting (基础题)

B-Casting

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 607    Accepted Submission(s): 303



Problem Description
Casting around for problems leads us to combine modular arithmetic with different integer bases, particularly the problem of computing values modulo b-1, where b is the base in which the value is represented. For example,

7829 10 mod 9 = 8,
37777777777777773 8 mod 7 = 6
123456 7 mod 6 = 3

(Note that 37777777777777773 8 = 1125899906842619 10 and 123456 7 = 22875 10.)

Your job is to write a program that reads integer values in various bases and computes the remainder after dividing these values by one less than the input base.
 

Input
The first line of input contains a single integer P, (1 <= P <= 1000) , which is the number o data sets that follow. Each data set should be processed identically and independently.

Each data set consists of a single line of input containing three space-separated values. The first is an integer which is the data set number. The second is an integer which is the number, B (2 <= B <= 10), denoting a numeric base. The third is an unsigned number, D, in base B representation. For this problem, the number of numeric characters in D will be limited to 10,000,000.
 

Output
For each data set there is a single line of output. It contains the data set number followed by a single space which is then followed by the remainder resulting from dividing D by (B-1).
 

Sample Input
  
  
4 1 10 7829 2 7 123456 3 6 432504023545112 4 8 37777777777777773
 

Sample Output
  
  
1 8 2 3 3 1 4 6
 

Source
 

Recommend
liuyiding
 

题意:
某一个很大的数,是由2到10的进制表示的,要将这个数取模,模数为该数进制减1。
思路:
1.首先明确这个很大的数字要由__int64或longlong实现也是很困难的,所以需要用字符串来记录数字。
2.既然这个数不是以10进制表示,就不难想到要将它换成10进制数后再取模。
3.其他进制的数转换成10进制数是需要从个位开始逐位乘以该位的进制的次方数,如二进制数 110 = 0 * 2^0 + 1 * 2^1 +1 * 2^2 = 6
4.有了以上想法,就容易想到边求和变取模的思路

/*************************************************************************
	> File Name: B.cpp
	> Author: BSlin
	> Mail:  
	> Created Time: 2013年10月06日 星期日 13时08分04秒
 ************************************************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iterator>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#define MP make_pair
#define INF (1<<30)
#define PI acos(-1.0)
#define esp 1e-8
const int dx[4]={0,0,0,0};
using namespace std;
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
#if defined (_WIN32) || defined (__WIN32) || defined (WIN32) || defined (__WIN32__)
#define LL __int64
#define LLS "%" "I" "6" "4" "d"
#else
#define LL long long
#define LLS "%" "l" "l" "d"
#endif



#define M 10000010

char str[M];

int main(int argc, char** argv) {
    //read;
    int t,num,B,Bnum,len,ans,MOD;
    scanf("%d",&t);
    while(t--) {
        scanf("%d %d %s",&num,&B,str);
        //printf("%d %d %s\n",num,B,str);
        len = strlen(str);
        Bnum = 1;
        MOD = B - 1;
        ans = (str[len-1] - '0') % MOD;
        for(int i=len-2; i>=0; i--) {
            Bnum = Bnum * B % MOD;
            ans = ((ans + (str[i] - '0') * Bnum % MOD) % MOD + MOD) % MOD;
        }
        printf("%d %d\n",num,ans);
    }
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值