Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5619 | Accepted: 2414 |
Description
Given a base b and two non-negative base b integers p and m, compute p mod m and print the result as a base b integer. p mod m is defined as the smallest non-negative integer k such that p = a*m + k for some integer a.
Input
Input consists of a number of cases. Each case is represented by a line containing three unsigned integers. The first, b, is a decimal number between 2 and 10. The second, p, contains up to 1000 digits between 0 and b-1. The third, m, contains up to 9 digits between 0 and b-1. The last case is followed by a line containing 0.
Output
For each test case, print a line giving p mod m as a base-b integer.
Sample Input
2 1100 101 10 123456789123456789123456789 1000 0
Sample Output
10 789
Source
问题链接:POJ2305 ZOJ1929 UVA10551 Basic remains
问题描述:(略)
问题分析:
输入b、p和m,计算p mod m。b是进制,p位数有可能达到1000位,m是b进制的(这里是坑)。
这个问题的关键就是进制计算和大数模除计算。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* POJ2305 ZOJ1929 UVA10551 Basic remains */
#include <iostream>
#include <stdio.h>
using namespace std;
const int N = 1000;
char p[N + 1], m[10];
void print(int n, int base)
{
if(n) {
int i = 0;
while(n > 0) {
p[i++] = '0' + n % base;
n /= base;
}
while(--i >= 0)
putchar(p[i]);
putchar('\n');
} else
printf("0\n");
}
int solve(int base)
{
int mod = 0;
for(int i = 0; m[i]; i++)
mod = mod * base + m[i] - '0';
int ans = 0;
for(int i = 0; p[i]; i++) {
ans = ans * base + p[i] - '0';
ans %= mod;
}
return ans;
}
int main()
{
int b;
while(~scanf("%d", &b) && b) {
scanf("%s%s", p, m);
print(solve(b), b);
}
return 0;
}