8.30难题留坑:计数器问题和素数等差数列问题

假期使人成猪,一个多月来其实有几次写博客的冲动,但是每次都是写一半没有坚持下来,一转眼就开学了。
放假这段时间看到两个很有意思的题目:计数器问题和素数等差数列问题。

1.计数器问题
8.30难题留坑:计数器问题和素数等差数列问题_第1张图片
无意在知乎看到这样一个问题,突然兴趣上头。
8.30难题留坑:计数器问题和素数等差数列问题_第2张图片

#include
using namespace std;
int main(){
     
 int count;
 count=0;
 int x;
 x=0;
 while(x<=8){
     
  int ra=rand()%2;
  if(ra=0){
     
  x++;
  }
  else{
     
   x--;
  }
  count++;
 }
 cout<<count<<endl;
 return 0;
}

输出结果为负,说明运算次数很大,而且同时暴露出一个问题,想要计算这个事件的平均次数,是一个很庞大的计算量。

将int换成double类型终于能给我一个数字了:
8.30难题留坑:计数器问题和素数等差数列问题_第3张图片

#include
using namespace std;
int main(){
     
 double count;
 count=0;
 int x;
 x=0;
 while(x<=8){
     
  int ra=rand()%2;
  if(ra=0){
     
  x++;
  }
  else{
     
   x--;
  }
  count++;
 }
 cout<<count<<endl;
 return 0;
}

但是未解决的问题就是,如何得出一个平均的值呢?这也许还得从概率论的方式去解决,同时一个很简单的数学问题也暴露出一个c++我觉得不完美的地方,就是rand函数。

上个月底集卡牌游戏《未定事件簿》横空出世我手痒痒写了一个模拟抽卡的模拟器,但是没想到在随机数生成这里碰了壁,朋友vb写的模拟器成了,于是我也放弃了攻克这个难题。
8.30难题留坑:计数器问题和素数等差数列问题_第4张图片
很可悲一个快成形的小程序就这样被抛弃期间试过用种子,也尝试过srand(unsigned)time(null),但是如果button点击较快,仍然无法生成想要的随机数。

2.素数等差数列问题
8.30难题留坑:计数器问题和素数等差数列问题_第5张图片
这是在看蓝桥杯真题时看到的一题,初看可能觉得没有难度但是如果把这题当成一个方程问题来看,其实是多了一个未知数的,可是我想写在一个主函数中暴力求解的想法在最后写到三重循环时放弃了。
这是我写的失败代码,准备找到问题再回头找找自己的问题:

#include 
using namespace std;
int p1[100010];
int main()
{
     
 for(int m=0;m<20000;m++){
     
  p1[m]=1;
 }
 for(int i=4;i<20000;i++){
     
  for(int j=2;j<i;j++){
     
   if(i%j==0){
     
    p1[i]=0;
    break;
   }
  }
 }
 for(int n=3;n<20000;n++){
     
  if(p1[n]){
     
   for(int s1=30;s1<1000;s1++){
     
   for(int s2=1;s2<=10;s2++){
     
    if(p1[n+s1*s2]=0){
     
     break;
    }
   }
   if(s2=10){
     
    cout<<s1<<endl;
    break;
   }
   }
  }
 }
 return 0;
}

8.30难题留坑:计数器问题和素数等差数列问题_第6张图片
输出都乱七八糟了。。。

答案参考

#include 
using namespace std;
int p[100010];
int prim[100010];
int len=0;
void isp()
{
     
    memset(p,0,sizeof(p));
    p[0]=1;p[1]=1;p[2]=0;
    for(int i=0;i<10000;i++)
    {
     
        if(p[i])
            continue;
        for(int j=i;j*i<10000;j++)
        {
     
            p[i*j]=1;
        }
        prim[len++]=i;
    }
}
int main()
{
     
    isp();
    for(int i=0;i<len;i++)
    {
     
         int ss=prim[i];
         for(int c=1;c<1000;c++)
         {
     
             int j;
             for(j=1;j<10;j++)
             {
     
                 if(p[ss+c*j])
                    break;
             }
             if(j>=10)
             {
     
                 cout<<c<<' '<<ss<<endl;
                 return 0;
             }
         }
    }
}

附上学霸教我的python的解法:

def main(n):
    i = 2
    data = []      # 素数
    while(True):
        flag = 1
        for a in range(2, i):   # 判断素数
            if i % a == 0:
                flag = 0
                break
        if flag:
            data.append(i)
        # 数列首元素
        for m in range(len(data)):  
            # 公差
            for t in range(1, data[len(data)-1]):
                temp = data[m]
                result = [temp]
                while(True):
                    if (temp + t) in data:
                        result.append(temp+t)
                        if len(result) == n:
                            print(result)
                            return t
                    else:
                        break
                    temp = temp + t
        i = i+1
print(main(10))

你可能感兴趣的:(菜鸟日常)