C语言求质数和各项累加值

希望出现的结果是:
输出两列,一列是质数,另一列是累加值。
如下:
2 2
3 5
5 10
7 17
9 26
……

img

#include <stdio.h>

// Returns 1 if x is a prime, otherwise returns 0.
int is_prime(unsigned int x) {
  if (x < 2)
    return 0;
  for (int i = 2; i * i <= x; i++) {
    if (x % i == 0)
      return 0;
  }
  return 1;
}

// Restores the last calculated prime and sum from EEPROM.
void restore(unsigned int *A, unsigned int *sum) {
  // ...
}

// Saves the calculated prime and sum to EEPROM for resuming the calculation
// later.
void save(unsigned int A, unsigned int sum) {
  // ...
}

// Shows LED for the specified period in ms.
void showLed(unsigned int ms) {
  // ...
}

int main() {
  unsigned int A = 0, sum = 0, n = 0, i = 0;
  restore(&A, &sum); // Restore the last A and sum from EEPROM
  while (++i > 0) {
    if (is_prime(i)) {
      A = i;
      if (sum + i < sum) {
        printf("overflow, stop\n");
        break;
      }
      sum += i;
      printf("%u %u\n", i, sum);
      if (++n % 10 == 0)
        showLed(2000); // Show LED for 2 seconds
      save(A, sum);    // Save current A and sum to EEPROM
    }
  }
  return 0;
}

这要求都很基础呀。但是需要注意的是不同的单片机,对内存读写、定时器操作、串口配置的方式都是不一样的,你需要给出具体的环境(其实即使给出了具体环境大概也没人会写,毕竟手里有MCU的还是你自己。板子在你手里,总不能让阿友们帮你云编程呀)
这里给个完整思路。
你的程序流程应该是这样的:
-初始化单片机:配置主频等
-初始化全局变量:16位的变量,存储当前计算的质数和当前的质数和
-读取flash内信息:在flash内需要存储上一次的质数和质数和,当然,第一次读取到0或者ff(这看你选的芯片的芯片手册里,flash默认值)
-初始化串口:准备串口通信以供打印
-初始化定时器:不要开启,只要初始化就好,定时要准
-进入主循环
然后,在主循环执行以下步骤:
-质数计算:质数计算用楼上的就好
-质数累加:质数求和略过,直接相加完事
-信息打印:打印使用printf(%d)进行,毕竟要求十进制
-flash写入:保存当前质数和质数和。如果你的算法需要一些关键的过程量,也可以存进来
整体难度不高的,题主加油吖!

单片机?和普通的C语言有啥区别么?

就是用C语言求这种算法一样,没有很大的区别!
然后代码参考:https://blog.csdn.net/m0_56311933/article/details/117911382

很简单啊,首先第一列是质数,第二列是累加。
下面是代码:

#include <bits/stdc++.h>
using namespace std;
int f(int n){//判断是否是质数
    int b=0;
    for(int i=2;i<n;i++){
        if(n%i==0)
        {
            b=1;//标记
            break;//如果n能被i整除退出循环
        }            
    }
    if(n>1&&b==0){
        return 1;
    }
    else{
        return 0;        
    }
}
long long a; //因为数据很大所以用long long类型
int main()
{
    for(long long i=2;i<=99999999999999999;i++){
        if(f(i)==1){
            a+=i;
            cout<<i<<" "<<a<<endl;
        }
    }
    return 0;
}