希望出现的结果是:
输出两列,一列是质数,另一列是累加值。
如下:
2 2
3 5
5 10
7 17
9 26
……
#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;
}