UVa 11371 - Number Theory for Newbies
2015-07-08 20:36
337 查看
題目:給你一個數字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即可。
說明:╮(╯▽╰)╭。
分析:數論。題目要求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; }
相关文章推荐
- load,initialize方法
- 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
- 南阳oj 题目39 水仙花数
- 利用差值求栈的最小元素
- Linux五种IO模型性能分析
- .NET出现频率非常高的笔试题
- 字库 文字表情
- 提高二十种存储记忆方法,无论您选择何种!
- 822 画图
- 如何在serviceg中监听各种按键
- java导出excel例子
- 使用freemarker生成word,步骤详解并奉上源代码
- 求int型数据在内存中存储时1的个数
- Java实现Excel导入数据库,数据库中的数据导入到Excel
- SQL 合并两个结果集 一个倒序,一个正序
- Linux命令之文件与目录的权限
- phpstorm配置debug
- SecureCRT 常用设置,日常使用方法------不放弃update
- 分类,类扩展
- 244 16进制的简单运算