zoukankan      html  css  js  c++  java
  • UVa 11371

    題目:給你一個數字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
    ",B,A,B-A,(B-A)/9LL);
    	}
        return 0;
    }
    


  • 相关阅读:
    vue2.0 练习项目-外卖APP(2)
    vue2.0 练习项目-外卖APP(1)
    迈向全栈开发学习(3)
    迈向全栈开发学习(2)
    迈向全栈开发学习(1)
    前端到后台ThinkPHP开发整站(完)
    前端到后台ThinkPHP开发整站(7)
    前端到后台ThinkPHP开发整站(6)
    前端到后台ThinkPHP开发整站(5)
    uniapp 设置全局scss生效
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5182910.html
Copyright © 2011-2022 走看看