<NOIP> 22 . P1028 数的计算

来源:互联网 发布:ubuntu 软件包破损 编辑:程序博客网 时间:2024/06/05 21:09

题解:这是洛谷的第22道题目,考察的是递归。

注意:一开始的时候,我没有理解这个题目的意思。举个例子应该能好说点:假设现在有一个自然数6,不大于6的一半的自然数是<1,2,3>,所以给它的左边加上这个数字,即为<16,26,36>。然后,对于16这个数字,由于刚才加的数字是“1”,所以不大于1的一半的自然数是不存在的。然后回溯到26这个数字,由于刚才加的数字是“2”,所以不大于2的一半的自然数是1,所以数字为126,然后对于126,由于刚才加的数字是“1”,所以不大于1的一半的自然数是不存在的。回溯到36,由于刚才加的数字是“3”,所以不大于2的一半的自然数是<1,2>,接下来的数字为136和236,对于236,再继续分···

仔细读上边的内容,感觉一个递归函数写好了。

源代码:

#include <string.h>#include <sstream>#include <stdlib.h>#include <math.h>using namespace std;int sum = 0;void add(int number,int size){    for (int i = 1; i <= size; i++)    {        int iCounter = 0;        int middle = number;        while (middle!=0)        {            middle = middle / 10;            iCounter++;        }        add(i * pow(10, iCounter) + number, i / 2);    }    //cout << number << " ";    sum++;}int main(){    int number;    cin >> number;    //cout << add(number) << endl;    add(number,number/2);    cout << sum << endl;    system("pause");    return 0;}