gpt4 book ai didi

c++ - 将[N]下的所有幸运数字添加到 vector 的算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:21:14 25 4
gpt4 key购买 nike

幸运数字被定义为一个正整数,其十进制表示仅包含幸运数字 4 和 7。例如,数字 47、744、4 是幸运的,而 5、17、467 则不是。

现在,假设我想将给定整数 [N] 下的所有幸运数字添加到一个 vector 中,而不使用递归。为简单起见,令 N = 1000。

我想出了一种方法,通过对 1 位数字、2 位数字等进行单独循环来检查 [N] 下所有数字的每一位。

for(int number=0;number<10;number++) {if(((number%10==4)||(number%10==7))) {lucky.push_back(number);}} //1 Digit Lucky Numbers
for(int number=10;number<100;number++) {if(((number%10==4)||(number%10==7))&&(((number/10)%10==7)||((number/10)%10==4))) {lucky.push_back(number);}} //2 Digit Lucky Numbers
for(int number=100;number<1000;number++) {if(((number%10==4)||(number%10==7))&&(((number/10)%10==7)||((number/10)%10==4))&&(((number/100)%10==7)||((number/100)%10==4))) {lucky.push_back(number);}} //3 Digit Lucky Numbers
for(int number=1000;number<10000;number++) {if(((number%10==4)||(number%10==7))&&(((number/10)%10==7)||((number/10)%10==4))&&(((number/100)%10==7)||((number/100)%10==4))&&(((number/1000)%10==7)||((number/1000)%10==4))) {lucky.push_back(number);}} //4 Digit Lucky Numbers

我在想这可以粗略地转换成类似的东西,但我不太能想出具体要做什么。

for(number;number<10*itr_counter;number++)
{
if(((number%10*itr_counter==4)||(number%10*itr_counter==7))) {lucky.push_back(number);}
itr_counter*=10;
}

我基本上想通过取模 10 并检查数字是 4 还是 7 来检查所有 1 位数字的每一位。类似地,对于由 X 位数字组成的数字,我取模并将该数字除以 10、100 等以检查 4 或 7。

这是解决上述问题的好方法吗?另外,有人可以帮助我将第一段代码优化为更小、更高效的代码吗?类似于第二个代码块的内容会起作用。

最佳答案

// Use a D bit number as a proxy for a D digit number
// Then use L=2^D as a proxy for D in a loop through required values of D
// Notice D is only implied, we don't need to actually store it.
for (unsigned L=2; ; L*=2)
{
// Loop through all D bit numbers (which happen to be all numbers less than L
for (unsigned N=0; N<L; ++N)
{
// Convert that D bit number into a D digit number
unsigned long long X = 0;
// Loop through the bits of N converting to digits
for ( unsigned B=L; (B>>=1)>0; )
{
X = X * 10 + 4;
if ( B & N ) X += 3; // change the 4 to a 7.
}
if ( X > MAX_NUMBER )
return; // break out of two levels of loop
lucky.push_back( X );
}
}

对于这样一个简单的任务来说,这可能看起来过于棘手。但是如果 MAX_NUMBER 非常大,这种方法比测试数字是否“幸运”要好得多。

另请注意,此方法在代码流中的一个尴尬点(在两级循环内)完成(检测完成)。在严肃的编程中,这种事情很常见。在这种情况下,我压倒性的偏好是将整个嵌套循环放入一个函数中,这样我就可以使用 return从函数作为一种简单的方法到break两层循环。使用 return 可能会严重冒犯结构化编程狂热者.您可以通过混合 done 来完成相同的流量控制。标志进入每个循环的控制。这种方法让我很反感 return冒犯了结构化编程狂热者。

关于这两个棘手循环的更多细节:

概念上我们有 D,我们希望它从 1 开始计数,直到我们遇到返回指令,我们想要计算 L=1<<D意思是唯一设置位在位置 D 的数字。但是我们完全跳过 D 并直接计算 L。

然后我们希望最内层的循环有一个位编号 E 并在概念上对 D 以下的位位置进行倒数:

for (E=D-1; E>=0; --E)

并且我们想要类似地计算B=1<<E作为唯一设置位在位置 E 的数字。但是同样我们没有 D 也不需要 E,我们可以直接计算 B。

关于c++ - 将[N]下的所有幸运数字添加到 vector 的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33676291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com