UVa 11371 - Number Theory for Newbies

題目:給你一個數字n。將裡面每位的數又一次組合形成a,b。使得a-b最大且是9的倍數。

分析:數論。

題目要求a,b和n的位數同样,不能有前導0。

            定理1:交換一個數字中的某兩個位的數,形成的新數組和原數字之差是9的倍數;

            證明1:設數字為abc..i..j...xwz。当中每一个字母代表一个位。相应值能够同样,

                          那么任意交换两位i。j得到的新数字为abc..j..i..xwz,做差为9..90..0 *(i-j)。

                          所以一定是9的倍数,得证。

           通過上面定理能够繼續證明。随意交換随意位數字形成的新數字和原數字的差是9的倍數;

           所以取a為最大組合。即遞減序,b為遞增序就可以。

           可是,這裡要求位數同样,所以b取首尾不是0的數字的最小值,先取遞增序。

           然後,交換第一個非0數和首位的1就可以。

說明:╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

bool cmp1(char a, char b)
{
	return a < b;
}

bool cmp2(char a, char b)
{
	return a > b;
}

int main()
{
	char buf[31];
	while (gets(buf)) {
		int len = strlen(buf);
		long long A = 0LL, B = 0LL;
		sort(buf, buf+len, cmp1);
		if (buf[0] == '0') {
			for (int i = 0; i < len; ++ i)
				if (buf[i] != '0') {
					swap(buf[i], buf[0]);
					break;
				}
		}
		for (int i = 0; i < len; ++ i)
			A = A*10LL + buf[i]-'0';
		sort(buf, buf+len, cmp2);
		for (int i = 0; i < len; ++ i)
 			B = B*10LL + buf[i]-'0';
 		printf("%lld - %lld = %lld = 9 * %lld\n",B,A,B-A,(B-A)/9LL);
	}
    return 0;
}


posted @ 2016-02-05 11:17  mengfanrong  阅读(186)  评论(0编辑  收藏  举报