您的位置:首页 > 其它

ural 1104. Don’t Ask Woman about Her Age

2011-05-18 23:08 375 查看
给你一个未知进制表示的数(小于等于36进制,长度最长100W),求一个进制,使得这个进制的这个数可以整除进制-1.



比如样例,22进制的A1A可以整除21.



我没多想,直接拿大数做了。。。只需要判断是否能整除,所以还是好写的,不过以前只写过除2的,其实都一样~~~



后来btw说他的方法了,因为这个数等于 b*x+a,所以它模(b-1)就是(x+a)%b。。。自己想下就好了。。。T T。。



不过写出来大数多进制除法还是蛮好的~



#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int MAX = 1000010;
int a[MAX],len;
char str[MAX];
bool div(int *a,int base,int d)
{
	int tmp = 0;
	for(int i=0; i<len; i++)
	{
		tmp *= base;
		tmp += a[i];
		if( tmp >= d )
			tmp = tmp - (tmp / d) * d;
	}
	return tmp == 0 ;
}
int solve()
{
	int beg = 0;
	for(int i=0; i<len; i++)
		if( a[i] > beg )
			beg = a[i];
	if( beg <= 1 ) return 2;
	for(int i=beg+1; i<=36; i++)
		if( div(a,i,i-1) )
			return i;
	return -1;
}
int main()
{
	scanf("%s",str);
	len = strlen(str);
	for(int i=0; i<len; i++)
		if( isdigit(str[i]) )
			a[i] = str[i] - '0';
		else
			a[i] = str[i] - 'A' + 10;
	int ans = solve();
	if( ans == -1 )
		printf("No solution./n");
	else
		printf("%d/n",ans);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: