Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 考虑到所有介于0和10^9之间的数字及其反面,有多少个数字是混合的、奇数和偶数?_Java_C++_Algorithm_Math_Analysis - Fatal编程技术网

Java 考虑到所有介于0和10^9之间的数字及其反面,有多少个数字是混合的、奇数和偶数?

Java 考虑到所有介于0和10^9之间的数字及其反面,有多少个数字是混合的、奇数和偶数?,java,c++,algorithm,math,analysis,Java,C++,Algorithm,Math,Analysis,下一个陈述是练习的问题 我做了这个解决方案。它正在执行从0到10^9的循环。但是执行死刑要花很多时间。所以,我想的下一步是在结果中添加一个hashmap,在数字和它的倒数之间作为键,保存结果 但该计划仍在消耗时间。我想我可能错过了一个数学理论或另一种在更短时间内解决时间问题的方法 节目: #include <iostream> #include <cmath> using namespace std; int reverseNumber(int n) { in

下一个陈述是练习的问题

我做了这个解决方案。它正在执行从0到10^9的循环。但是执行死刑要花很多时间。所以,我想的下一步是在结果中添加一个hashmap,在数字和它的倒数之间作为键,保存结果

但该计划仍在消耗时间。我想我可能错过了一个数学理论或另一种在更短时间内解决时间问题的方法

节目:

#include <iostream>
#include <cmath>

using namespace std;

int reverseNumber(int n) {
    int reverse = 0;

    while (n > 0) {
        reverse = reverse * 10;
        reverse += n % 10;
        n = n / 10;
    }

    return reverse;
}

string isNumberEvenOddOrMixed(int n) {
    bool even = false;
    bool odd = false;

    while (n > 0) {
        int rem = n % 10;
        n = n / 10;

        if (rem % 2 == 0)
            even = true;
        else
            odd = true;
    }

    return even && odd ? "Mixed" : (even ? "Even" : "Odd");
}

int main(int argc, const char * argv[]) {
    int even = 0, odd = 0, mixed = 0;

    for (int i = 0; i < pow(10, 9); i++) {
        // Verify if i already exists in the hashmap,
        // if it is, just print the value saved.

        int nReversed = reverseNumber(i);
        int sum = i + nReversed;
        string result = isNumberEvenOddOrMixed(sum);


        if (result == "Even") even++;
        else if (result == "Odd") odd++;
        else mixed++;

        // Save i and nReversed in a hashmap with the result
        // hashmap[i] = result;
        // hashmap[nReversed] = result;

        cout << i << " + " <<  nReversed << " = " << sum << " : " << result << "\n";
    }

    cout << "Even: " << even << "\n";
    cout << "Odd: " << odd << "\n";
    cout << "Mixed: " << mixed << "\n";

    return 0;
}

以下是一些小的优化想法:

一,

此循环每次都在重新计算10^9。只需执行一次并将其存储在常量变量中

二,


我会将isNumberReveNodeDormix函数更改为返回枚举值而不是字符串。不必比较、创建和销毁字符串,它将使性能略有提高。

如果您只需要计算奇数、偶数和混合结果,您应该能够通过计算11111111 92条记录(约为[0,10^9]总数的十分之一)来找到结果

解决思路

对于0到9,只需全部计算即可

对于剩余的值,请按以下方式考虑。您不需要构建表,而是使用概念

为相同位数的值设置表格让位数为r

大小:9列,10^r-1行 值分布:左上角是该数字部分的最小值,向下移动时加1,向右移动时加10^r-1 1020300405060708090

11213114161718191

12 22 32 42 52 62 72 82 92

19293949596798999

查看此表,您将观察到任何值的结果都将与位于其右上角的值的结果相同,向上为1,向右为1

从这个意义上讲,您应该能够看到对于数字r表,可以通过查找第一列和最后一行上的值的结果来计算计数,然后对于每个计算结果,乘以第2点对角线上正确的计数器数值,数值介于1到9之间

10*1的结果 11*2的结果 12*3的结果 13*4的结果 14*5的结果 15*6的结果 16*7的结果 17*8的结果 18*9的结果 19*9的结果 结果29*8 结果39*7 结果49*6 59*5的结果 结果69*4 结果79*3 结果89*2 99*1的结果 计数器分配:左上1,向下移动时增加计数器1,直到达到9。右下1,向左移动时增加计数器1

证明

假设值“abcdefg”和“a”不等于1,“bcdefg”不等于0。 在这种情况下,上表中“abcdefg”的右上位置应该存在

将“abcdefg”改写为a*10^r-1+b*10^r-2+c*10^r-3+…+f*10 +g

“abcdefg”的反面是g*10^r-1+f*10^r-2+e*10^r-3++ b*10+a

“abcdefg”的计算值为a+g*10^r-1+b+f*10^r-2+ c+e*10^r-3+…+f+b*10+g+a

“abcdefg”右上角的值为“abcdefg”+10^r-1-1。我们可以将其写成“abcdefg”,其中a=a+1,g=g-1

将“abcdefg”改写为a*10^r-1+b*10^r-2+c*10^r-3++ f*10+g

“abcdefg”的反面是g*10^r-1+f*10^r-2+e*10^r-3+。。。 +b*10+a

“abcdefg”的计算值为a+g*10^r-1+b+f*10^r-2+ c+e*10^r-3+…+f+b*10+g+a

由于g+a=g-1+a+1=g+a,我们计算了‘abcdefg’的值 a+g*10^r-1+b+f*10^r-2+c+e*10^r-3+…+f+b*10 +g+a,等于“abcdefg”的计算值


这证明了,对于int i=0;i我也不明白为什么这个问题有这么多的反对票。我认为这是一个不太容易的问题,你已经发布了你的代码,详细阐述了这个问题,等等…战俘甚至不需要被调用,而且它有可能给出错误的结果。看,是的,你是对的。我并不是真的想暗示他应该使用pow,只是他应该先计算结果,但我可以看出我不清楚。谢谢你明智的回答。我很惊讶你能这么快找到这个好的解决方案。我做了r=2的样本。对于r=3的情况,如果我理解得很好,有必要计算从100到199的数字,递增1,然后199递增100,对吗?@oscar.fimbres是的,这对于r=3的情况是正确的。一个简单的方法是生成一些连续样本,然后寻找重复模式。
0 + 0 = 0 : Odd
1 + 1 = 2 : Even
2 + 2 = 4 : Even
3 + 3 = 6 : Even
4 + 4 = 8 : Even
5 + 5 = 10 : Mixed
6 + 6 = 12 : Mixed
7 + 7 = 14 : Mixed
8 + 8 = 16 : Mixed
9 + 9 = 18 : Mixed
10 + 1 = 11 : Odd
11 + 11 = 22 : Even
12 + 21 = 33 : Odd
13 + 31 = 44 : Even
14 + 41 = 55 : Odd
15 + 51 = 66 : Even
16 + 61 = 77 : Odd
17 + 71 = 88 : Even
18 + 81 = 99 : Odd
19 + 91 = 110 : Mixed
20 + 2 = 22 : Even
21 + 12 = 33 : Odd
22 + 22 = 44 : Even
23 + 32 = 55 : Odd
24 + 42 = 66 : Even
25 + 52 = 77 : Odd
26 + 62 = 88 : Even
27 + 72 = 99 : Odd
28 + 82 = 110 : Mixed
29 + 92 = 121 : Mixed
30 + 3 = 33 : Odd
31 + 13 = 44 : Even
32 + 23 = 55 : Odd
33 + 33 = 66 : Even
34 + 43 = 77 : Odd
35 + 53 = 88 : Even
36 + 63 = 99 : Odd
37 + 73 = 110 : Mixed
38 + 83 = 121 : Mixed
39 + 93 = 132 : Mixed
40 + 4 = 44 : Even
41 + 14 = 55 : Odd
42 + 24 = 66 : Even
43 + 34 = 77 : Odd
44 + 44 = 88 : Even
45 + 54 = 99 : Odd
46 + 64 = 110 : Mixed
47 + 74 = 121 : Mixed
48 + 84 = 132 : Mixed
49 + 94 = 143 : Mixed
50 + 5 = 55 : Odd
51 + 15 = 66 : Even
52 + 25 = 77 : Odd
53 + 35 = 88 : Even
54 + 45 = 99 : Odd
55 + 55 = 110 : Mixed
56 + 65 = 121 : Mixed
57 + 75 = 132 : Mixed
58 + 85 = 143 : Mixed
59 + 95 = 154 : Mixed
60 + 6 = 66 : Even
61 + 16 = 77 : Odd
62 + 26 = 88 : Even
63 + 36 = 99 : Odd
64 + 46 = 110 : Mixed
65 + 56 = 121 : Mixed
66 + 66 = 132 : Mixed
67 + 76 = 143 : Mixed
68 + 86 = 154 : Mixed
69 + 96 = 165 : Mixed
70 + 7 = 77 : Odd
71 + 17 = 88 : Even
72 + 27 = 99 : Odd
73 + 37 = 110 : Mixed
74 + 47 = 121 : Mixed
75 + 57 = 132 : Mixed
76 + 67 = 143 : Mixed
77 + 77 = 154 : Mixed
78 + 87 = 165 : Mixed
79 + 97 = 176 : Mixed
80 + 8 = 88 : Even
81 + 18 = 99 : Odd
82 + 28 = 110 : Mixed
83 + 38 = 121 : Mixed
84 + 48 = 132 : Mixed
85 + 58 = 143 : Mixed
86 + 68 = 154 : Mixed
87 + 78 = 165 : Mixed
88 + 88 = 176 : Mixed
89 + 98 = 187 : Mixed
90 + 9 = 99 : Odd
91 + 19 = 110 : Mixed
92 + 29 = 121 : Mixed
93 + 39 = 132 : Mixed
94 + 49 = 143 : Mixed
95 + 59 = 154 : Mixed
96 + 69 = 165 : Mixed
97 + 79 = 176 : Mixed
98 + 89 = 187 : Mixed
99 + 99 = 198 : Mixed
Even: 24
Odd: 26
Mixed: 50
Program ended with exit code: 0
for (int i = 0; i < pow(10, 9); i++)