51NOD 1385凑数字(找规律?)

》》点击进入原题测试《《

思路:这个题是真的想了蛮久,枚举了一下前一百就发现了规律,要想最短的话就是要构建1234567890这个字符串;刚开始找到的规律从1开始枚举到N,每满一百加一,每出现一个各个位数上数字相同的(例如3,22,111)都加一;然后数太大枚举肯定要超时,于是改进了一下,假如这个数是一千,那么它最小位数起码是10*3;假如这个数是一万,那么这个最小位数起码是10*4;依次类推,可以发现最小位数的组成部分肯定有10*(len-1),然后剩下的就是找到看n能被多少个len个1的数整除,加上这个数就可以了。但是这样只过了一半样例,下载一个错误的样例发现,输入太大了,已经超过了longlong的范围,所有这种方案也失败了。然后当然是百度,发现自己好像多此一举了,直接加上第一位n[0]然后在判断n的所有字符是否相同,如果相同则再加一。

#include<cstdio>
#include<string>
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
    string num;
    cin >> num;
    stringstream ss;
        
    ss << num;
    long long cnum; ss >> cnum;
    ss.clear();
    long long sum = 0;
    sum += 10 * (num.length() - 1);
    cout << sum << endl;
    string slen(num.length(), '1');
    ss << slen;
    long long cslen; ss >> cslen;
    ss.clear();
    sum += cnum / cslen;
    cout << sum << endl;
    
    return 0;
}
过了一半样例

但是还是错了!发现自己想问题还是想的太简单了,并不是后面所有位是相同才加一,大于等于相同位数相同的那个数都能够进行加一,比如223比222大

再次在提供两组样例

输入样例1:
777777777777777777777777777777777777777777777777777776
输出样例1:
536

输入样例2:
1156532368851100011559833235112186568441122132385787789665411223354115898941005523300114444886300010
输出样例2:
991
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main()
{
    string num;
    cin >> num;
    
    long long sum = 0;
    sum += 10 * (num.length() - 1);
    sum += num[0] - '1';

    int flag = 1;
    for (int i = 0; i < num.length() - 1; i++)
        if (num[i] <num[i + 1]){        //假如后面有一位数大于前一位就不用在找了
                break;
        }
        else if (num[i] > num[i + 1]){
            flag = 0; break;
        }

    if (flag)sum++;

    cout << sum << endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/zengguoqiang/p/9329338.html