• CodeForces


    /*
      法一:
      这是我最初的做法,制表,但是...这种方法其实,完全想明白,规避所有漏洞,并不是那么简单,而且即便想明白了,思路其实也不是清晰直接的...下次还是不要这样做了
      
      又及,之前没想到先找这组 Lucky Number的顺次规律,而是...一个一个数去枚举求解,甚至,我一开始,还是把枚举的数作为数组下标的,而不是将目前已有的Lucky Numbr个数做下标,枚举的数作为数组元素值
      
      现在想来,当时真是太傻了,难怪老是WA,就像我这写题...对时效都不怎么敏感,没遇到TLE已经算是万幸了!...其实本来用枚举的数做下标时,dev上已经TLE了,只是我没交上去判而已...
      
      以及,以后做题时不要老想着暴力破解那种蛮力做法,先想想能不能使巧劲,多想想:还有没有更好的方法?还能不能再降低些复杂度等等,多想想再真正动手去敲!!!(毕竟做ACM的血泪教训就是:第一眼看完想到的方法,往往都是不能AC的,往往都超时)
    */



    #include <bits/stdc++.h>
    using namespace std;
    const int N = 10000;
    const int M = 2e9;
    typedef long long LL;
    LL a[N];
    
    int main()
    {
    	memset(a, 0, sizeof(a));
    /*	for (LL i = 1; i <= N; i++)
    	{
    		int sum = 0, not0 = 0, tp;
    		LL j = i;
    		while (j)
    		{
    			tp = j % 10;
    			sum++;
    			if (tp) not0++;
    			if (not0 > 1) break;
    			j = j / 10;
    		}
    		if (not0 == 1) a[cnt++] = i;
    	}*/
    	a[0] = 1; int cnt = 1;
    	for (LL i = 1, j = 1; i <= M ; )
    	{
    		while (j < 10 * i)
    		{
    			j += i;
    			a[cnt++] = j;
    		}
    		i *= 10; 
    		j = i;
    	}
    //	for (int i = 0; i < cnt; i++) cout << a[i] << " ";
    	int n;
    	while (cin >> n)
    	{
    		for (int i = 0; i < cnt; i++)
    		{
    			if (a[i] > n)
    			{
    				cout << a[i] - n << endl;
    				break;
    			}
    		}
    	}
    
    	return 0;
    }



    /*法二
    这种方法的思路很值得学习
    log10(n)得到的,是n除了最高位外,还有多少位
    将这个数字传入pow函数,可得到n的基数,即n的最高位改为1,其他位改为0的数,先记作tp
    n/tp*tp,相当于最高位不变,其他位置0,再加上tp,相当于最高位加1
    至于为什么这样处理,可以参考Lucky Number序列,发现它们就是满足这样的规律
    */
    #include <bits/stdc++.h>
    using namespace std;
    int pow(int n)
    {
    	int ans = 1;
    	while (n--) ans *= 10;
    	return ans;
    } 
    
    int main()
    {
    	int n;
    	cin >> n;
    	if (n < 10)
    	{
    		cout << 1 << endl; return 0;
    	}
    	int high = log10(n);
    	int ans = n / pow(high) * pow(high) + pow(high);
    	cout << ans - n << endl;
    	return 0;
    }


    /*
    法三
    和法一思路基本一致,算出除最高位以外的位数,暂记t1,这就是新Lucky Year从个位开始,向左数的连续0的个数
    分离出最高位,下一个Lucky Year,最高位是n的最高位+1
    
    比较有区别的地方是,得到最高位的方式和法一不同,具体就自己再比较和感受吧
    */
    
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	cin >> n;
    	
    	int tp = n, dig = 0, ans = 1;
    //	while (tp >= 10) 和下句效果相同 
    	while (tp / 10)
    	{
    		dig++;
    		tp /= 10;
    	}
    	tp++;
    //	for (int i = 0; i < dig; i++) 和下句效果相同 
    	while (dig--) ans *= 10;
    	cout << tp * ans - n << endl;
    	return 0;
    }


    //其实思路都是大同小异,也不好叫法四了,最多叫写法四 T^T
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	cin >> n;
    	
    	int tp = n, dig = 0, ans = 1, i, j;
    	for (i = 0; tp / 10; i++)
    		tp /= 10;
    		
    	if (i == 0)
    	{
    		cout << 1 << endl;
    		return 0;
    	}
    	for (j = 1; j <= i; j++) ans *= 10;
    	ans *= (tp + 1);
    	cout << ans - n << endl;
    	return 0;
    }


  • 相关阅读:
    应用图标大小
    AndroidStudio使用笔记
    shell 三剑客之 sed 命令详解
    shell 三剑客之 sed pattern 详解
    shell 文本处理三剑客之 grep 和 egrep
    Shell 编程中的常用工具
    shell 函数的高级用法
    shell 数学运算
    shell 变量的高级用法
    nginx 之 https 证书配置
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789511.html
Copyright © 2020-2023  润新知