big_data_mul

这是一个C++程序,实现了两个大整数的相加和相乘操作。程序通过逆序遍历字符串表示的大整数,进行逐位计算,并处理进位。最后将结果以字符串形式输出。

#include<iostream>
#include<string>


using namespace std;


void AddTwoString(string &sum,string &tmp)
{
string s1(sum),s2(tmp),tmp1,result;
int step=0,m;
if(s1.size()<s2.size()) { tmp1=s1;s1=s2;s2=tmp1; }
string::reverse_iterator r1=s1.rbegin(),r2=s2.rbegin();
while(r2!=s2.rend())
{
  m=(*r1-'0')+(*r2-'0')+step;
  step=m/10;
  result.push_back(m%10+'0');
  r1++; r2++;
}
if(r1==s1.rend()&&step) result.push_back(step+'0');//!!!!!!!!!!!!
while(r1!=s1.rend())
{
  m=(*r1-'0')+step;
  step=m/10;
  result.push_back(m%10+'0');
  r1++;
}
tmp1="";
for(string::reverse_iterator r=result.rbegin();r!=result.rend();r++)
tmp1.push_back(*r);
sum=tmp1;
// cout<<s1<<"+"<<s2<<"="<<sum<<endl;

}



void MulTwoString(string &s1,string &s2,string &mul)
{
if(s1==""||s2=="") {cout<<"illegal input!"<<endl; return; }
for(string::iterator t1=s1.begin();t1!=s1.end();t1++) 
  if(!(*t1>='0'&&*t1<='9')) 
{cout<<"s1 is illegal input!"<<endl; return; }
for(string::iterator t2=s2.begin();t2!=s2.end();t2++) 
  if(!(*t2>='0'&&*t2<='9')) 
{cout<<"s2 is illegal input!"<<endl; return; }

string tmp,sum;
int step=0,jinwei,m,t;
if(s1.size()<s2.size()){tmp=s1;s1=s2;s2=tmp;}
// cout<<"after swap, s1="<<s1<<"  s2="<<s2<<endl;  //
for(string::reverse_iterator rt2=s2.rbegin();rt2!=s2.rend();rt2++)
{  tmp="";
  m=(*rt2)-'0';
  jinwei=0;
  //t=0;
  for(string::reverse_iterator rt1=s1.rbegin();rt1!=s1.rend();rt1++)
  {
t=m*((*rt1)-'0')+jinwei;
jinwei=t/10;
tmp.push_back((t%10)+'0');
  }
  if(jinwei)tmp.push_back(jinwei+'0');
  
  string tmp2;
  for(string::reverse_iterator r2=tmp.rbegin();r2!=tmp.rend();r2++)
tmp2.push_back(*r2);
  tmp=tmp2;

// cout<<"tmp="<<tmp<<endl;


  if(sum=="") sum=tmp;
  else{
int k=step;
while(k){  tmp.push_back('0'); k--; }
AddTwoString(sum,tmp);
  }
  step++;
}
mul=sum;
}



int main()
{
string s1,s2,mul;
//int step=0;
cout<<"enter two numbers:"<<endl;
cin>>s1;
cin.clear();
cin>>s2;
cout<<"s1="<<s1<<"\ns2="<<s2<<endl;
MulTwoString(s1,s2,mul);
if(mul!="")cout<<"s1*s2="<<mul<<endl;
return 0;
}

#include "SW2812RGB.h" #include "stm32f0xx.h" #include "stdbool.h" #include "string.h" #include "stdlib.h" //呼吸灯相关参数 uint16_t rgb_breath_time;//呼吸计数值,放在定时器中 #define breath_change_sum (0x04) //呼吸灯每次变化的亮度值 #define breath_level (15) //呼吸灯亮度档位,需要与breath_change_sum配合好,防止过快或者过慢进入全亮或全灭,才能达到较好的呼吸效果 uint8_t breath_color; uint8_t level; uint8_t breath_R; uint8_t breath_G; uint8_t breath_B; //呼吸灯相关参数 //流水灯相关参数 uint16_t rgb_flow_time;//流水计数值,放在定时器中 uint8_t flow_circle; uint8_t flow_color=0; //流水灯相关参数 //水滴灯相关参数 uint16_t rgb_drip_time; uint8_t drip_circle; uint8_t drip_mult_circle; uint8_t drip_R=0; uint8_t drip_G=0; uint8_t drip_B=0; uint8_t drip_color; //累加灯相关参数 uint16_t rgb_account_time; uint8_t big_circle;//大循环,用于记录操作总共点亮几个灯的变化过程 uint8_t small_circle;//小循环,用于记录某个灯移动点亮的变化过程 uint8_t accumulation_color;//多色累加灯 extern TIM_HandleTypeDef htim3; #define LED_COUNT 100 // 定义WS2812数据协议的0和1对应的PWM占空比 #define WS2812_0 15 // 示例值,需要根据实际情况调整 #define WS2812_1 45 // 示例值,需要根据实际情况调整 // 发送一个字节的数据 void send_byte(uint8_t data) { for (int i = 7; i >= 0; i--) { if (data & (1 << i)) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, WS2812_1); } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, WS2812_0); } // 延时一段时间,确保WS2812正确接收数据 for (int j = 0; j < 10; j++); } } // 发送RGB颜色数据到所有LED void send_led_data(uint8_t r, uint8_t g, uint8_t b) { for (int i = 0; i < LED_COUNT; i++) { send_byte(g); send_byte(r); send_byte(b); } // 发送复位信号,让WS2812更新显示 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); HAL_Delay(1); } int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM3_Init(); MX_TIM14_Init(); //MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_Delay(100); HAL_TIM_Base_Start_IT(&htim14); /* USER CODE END 2 */ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // 示例:将所有LED设置为红色 send_led_data(255, 0, 0); HAL_Delay(1000); // 示例:将所有LED设置为绿色 send_led_data(0, 255, 0); HAL_Delay(1000); // 示例:将所有LED设置为蓝色 send_led_data(0, 0, 255); HAL_Delay(1000); } /* USER CODE END 3 */ }怎么RGB灯还是不点亮
最新发布
11-26
#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/RS485/rs485.h" #include "i2c.h" #include <math.h> #include <string.h> #include <stdio.h> // 设备参数(根据图片中的协议设置) #define DEVICE_ADDR 0x01 // 设备地址(出厂默认1) #define BROADCAST_ADDR 0xFE // 广播地址(用于修改设备参数) #define CURRENT_REG_ADDR 0x0000 // 第1路电流数据寄存器地址 #define VOLTAGE_REG_ADDR 0x0020 // 第1路电压数据寄存器地址 #define CT_RATIO_ADDR 0x0030 // 电流互感器变比设置寄存器地址(关键:0x0030) #define REGISTER_COUNT 0x0001 // 每次读取1个寄存器 // Modbus功能码 #define MODBUS_READ_HOLDING_REG 0x03 // 读取保持寄存器 #define MODBUS_WRITE_SINGLE_REG 0x06 // 写单个寄存器 // 显示通道结构体 typedef struct { char* label; float value; uint16_t color; uint16_t x; uint16_t y; char last_display[30]; } DisplayChannel; /* 计算Modbus CRC16校验 */ uint16_t modbus_crc16(uint8_t *data, uint8_t length) { uint16_t crc = 0xFFFF; for (uint8_t pos = 0; pos < length; pos++) { crc ^= (uint16_t)data[pos]; for (uint8_t i = 8; i != 0; i--) { if ((crc & 0x0001) != 0) { crc >>= 1; crc ^= 0xA001; } else { crc >>= 1; } } } return crc; } /* 读取Modbus寄存器数据 */ int16_t read_modbus_register(uint16_t reg_addr, uint16_t reg_count, uint16_t *results) { uint8_t tx_buf[8]; uint8_t rx_buf[256]; uint8_t rx_len = 0; // 构造Modbus RTU请求帧 tx_buf[0] = DEVICE_ADDR; tx_buf[1] = MODBUS_READ_HOLDING_REG; tx_buf[2] = (reg_addr >> 8) & 0xFF; tx_buf[3] = reg_addr & 0xFF; tx_buf[4] = (reg_count >> 8) & 0xFF; tx_buf[5] = reg_count & 0xFF; uint16_t crc = modbus_crc16(tx_buf, 6); tx_buf[6] = crc & 0xFF; tx_buf[7] = (crc >> 8) & 0xFF; rs485_send_data(tx_buf, 8); delay_ms(100); rs485_receive_data(rx_buf, &rx_len); if (rx_len < 5) return -1; if (rx_buf[0] != DEVICE_ADDR || rx_buf[1] != MODBUS_READ_HOLDING_REG) return -2; uint8_t data_bytes = rx_buf[2]; if (data_bytes != reg_count * 2) return -3; if (rx_len >= 3) { uint16_t received_crc = (rx_buf[rx_len-1] << 8) | rx_buf[rx_len-2]; uint16_t calc_crc = modbus_crc16(rx_buf, rx_len - 2); if (received_crc != calc_crc) return -4; } for (int i = 0; i < reg_count; i++) { results[i] = (rx_buf[3 + i*2] << 8) | rx_buf[4 + i*2]; } return 0; } /* 写入Modbus寄存器(用于修改CT变比) */ int16_t write_modbus_register(uint16_t reg_addr, uint16_t value) { uint8_t tx_buf[8]; uint8_t rx_buf[256]; uint8_t rx_len = 0; // 构造Modbus RTU写寄存器命令 tx_buf[0] = DEVICE_ADDR; tx_buf[1] = MODBUS_WRITE_SINGLE_REG; tx_buf[2] = (reg_addr >> 8) & 0xFF; tx_buf[3] = reg_addr & 0xFF; tx_buf[4] = (value >> 8) & 0xFF; tx_buf[5] = value & 0xFF; uint16_t crc = modbus_crc16(tx_buf, 6); tx_buf[6] = crc & 0xFF; tx_buf[7] = (crc >> 8) & 0xFF; rs485_send_data(tx_buf, 8); delay_ms(100); rs485_receive_data(rx_buf, &rx_len); if (rx_len < 8) return -1; if (rx_buf[0] != DEVICE_ADDR || rx_buf[1] != MODBUS_WRITE_SINGLE_REG) return -2; return 0; } /* 设置电流互感器变比为1:1(关键修改) */ uint8_t set_ct_ratio_1_to_1(void) { // 根据图片说明,CT变比寄存器地址为0x0030 // 默认值为2000(2000:1),现在设置为1(1:1) return (write_modbus_register(CT_RATIO_ADDR, 1) == 0); } /* 读取电压和电流数据 */ uint8_t read_power_data(float *voltage, float *current) { uint16_t voltage_reg; uint16_t current_reg; // 分别读取电压和电流寄存器 if (read_modbus_register(VOLTAGE_REG_ADDR, 1, &voltage_reg) != 0) { return 0; } if (read_modbus_register(CURRENT_REG_ADDR, 1, &current_reg) != 0) { return 0; } // 根据协议转换数据(单位:0.01V 和 0.01A) *voltage = voltage_reg * 0.01f; // 电压:寄存器值 × 0.01 = 实际电压(V) *current = current_reg * 0.01f; // 电流:寄存器值 × 0.01 = 实际电流(A) return 1; } /* 计算电缆阻抗 */ float calculate_impedance(float voltage, float current) { if (fabsf(current) < 0.001f || voltage < 0 || current < 0) { return -1.0f; } return voltage / current; } /* LCD显示函数 */ void lcd_display_channel_optimized(DisplayChannel* channel, uint8_t size) { char buffer[30]; if (strcmp(channel->label, "Impedance") == 0) { if (channel->value < 0) { snprintf(buffer, sizeof(buffer), "%s: N/A", channel->label); } else if (channel->value > 1000) { snprintf(buffer, sizeof(buffer), "%s:%.2fkΩ", channel->label, (double)(channel->value/1000)); } else { snprintf(buffer, sizeof(buffer), "%s:%.2fΩ", channel->label, (double)channel->value); } } else { snprintf(buffer, sizeof(buffer), "%s:%.3f%s", channel->label, (double)channel->value, (strcmp(channel->label, "Voltage") == 0) ? "V" : "A"); } if (strcmp(buffer, channel->last_display) != 0) { uint16_t text_width = strlen(buffer) * size * 6; lcd_fill(channel->x, channel->y, channel->x + text_width, channel->y + size + 2, WHITE); lcd_show_string(channel->x, channel->y, 240, size, size, buffer, channel->color); strncpy(channel->last_display, buffer, sizeof(channel->last_display) - 1); channel->last_display[sizeof(channel->last_display) - 1] = '\0'; } } /* 显示状态信息 */ void lcd_show_status(uint16_t x, uint16_t y, char* status, uint16_t color) { static char last_status[50] = ""; if (strcmp(status, last_status) != 0) { lcd_fill(x, y, 240, y + 16, WHITE); lcd_show_string(x, y, 200, 16, 16, status, color); strncpy(last_status, status, sizeof(last_status) - 1); last_status[sizeof(last_status) - 1] = '\0'; } } int main(void) { HAL_Init(); sys_stm32_clock_init(RCC_PLL_MUL9); delay_init(72); usart_init(115200); led_init(); lcd_init(); rs485_init(9600); // 初始化显示 lcd_clear(WHITE); lcd_show_string(30, 20, 200, 16, 16, "Power Monitor System", BLUE); lcd_show_string(40, 40, 200, 16, 16, "Setting CT Ratio 1:1", RED); // 初始化显示通道 DisplayChannel channels[3] = { {"Voltage", 0.0f, RED, 30, 80, ""}, {"Current", 0.0f, BLUE, 30, 110, ""}, {"Impedance", 0.0f, GREEN, 30, 140, ""} }; // 显示固定标签 for (int i = 0; i < 3; i++) { char label[30]; snprintf(label, sizeof(label), "%s:", channels[i].label); lcd_show_string(channels[i].x, channels[i].y, 100, 16, 16, label, BLACK); } // 关键修改:设置CT变比为1:1 lcd_show_status(30, 160, "Setting CT Ratio to 1:1...", BLUE); delay_ms(1000); // 尝试设置CT变比为1:1 uint8_t ct_set_success = 0; uint8_t retry_count = 0; while (retry_count < 3 && !ct_set_success) { char status[50]; snprintf(status, sizeof(status), "Setting CT Ratio... Try %d", retry_count + 1); lcd_show_status(30, 160, status, BLUE); if (set_ct_ratio_1_to_1()) { ct_set_success = 1; lcd_show_status(30, 160, "CT Ratio Set to 1:1 OK", GREEN); delay_ms(2000); } else { retry_count++; delay_ms(500); } } if (!ct_set_success) { lcd_show_status(30, 160, "CT Ratio Set Failed", RED); delay_ms(2000); } lcd_show_status(30, 160, "Monitoring...", GREEN); uint32_t last_refresh = 0; uint16_t error_count = 0; uint16_t success_count = 0; while (1) { uint32_t current_time = HAL_GetTick(); if (current_time - last_refresh > 2000) { float voltage_val, current_val; if (read_power_data(&voltage_val, &current_val)) { channels[0].value = voltage_val; channels[1].value = current_val; channels[2].value = calculate_impedance(voltage_val, current_val); for (int i = 0; i < 3; i++) { lcd_display_channel_optimized(&channels[i], 16); } success_count++; char status[50]; snprintf(status, sizeof(status), "OK:%d Err:%d", success_count, error_count); lcd_show_status(30, 180, status, GREEN); } else { error_count++; char status[30]; snprintf(status, sizeof(status), "Error: %d", error_count); lcd_show_status(30, 180, status, RED); } LED0_TOGGLE(); last_refresh = current_time; } delay_ms(10); } } 为什么还是显示的电流数值为0,硬件和通讯地址没问题
10-10
### # coding=utf8 ''' Modified in 2016/03/28 @author: xjunior ''' from cma.music.DataQueryClient import DataQueryClient if __name__ == "__main__": ''' 格点场要素获取(切块),返回RetGridArray2D对象 ''' # 1. 定义client对象 client = DataQueryClient() # 2. 调用方法的参数定义,并赋值 # 2.1 用户名&密码 userId = "??" pwd = "??" # 2.2 接口ID interfaceId = "??" #interfaceId = "??" start_date = "20250617" time_start = f"{date_str}000000" # 00:00:00 time_end = f"{date_str+1}000000" # 23:59:59 time_range = f"[{time_start},{time_end})" #) #start_date = "20250617" # 2.3 接口参数,多个参数间无顺序 # 必选参数 (1)资料:中国地面逐小时资料; (2)检索要素:站号、站名、小时降水、气压、相对湿度、能见度、2分钟平均风速、2分钟风向; # (3)检索时间;(4)排序:按照站号从小到大;(5)返回最多记录数:10。 for i in range(3): params = {'dataCode':"SURF_CHN_MUL_MIN",\ 'elements':"Station_Id_C,Station_levl,Lat,Lon,Alti,Admin_Code_CHN,V_ACODE_4SEARCH,Town_code,City,Station_Name,Cnty,COUNTRYCODE,Country,NetCode,Province,REGIONCODE,Town,Mon,Day,Hour,Min,Station_Id_d,Station_Type,REP_CORR_ID,V08010,PRS_Sensor_Alti,VIS_Sensor_Heigh,TEM_RHU_Sensor_Heigh,WIN_S_Sensor_Heigh,V02180,V02183,V02175,V02177,PRS,PRS_Sea,WIN_S_Gust_Max,WIN_D_Gust_Max,WIN_D_INST,WIN_S_INST,WIN_D_Avg_1mi,WIN_S_Avg_1mi,WIN_D_Avg_2mi,WIN_S_Avg_2mi,WIN_D_Avg_10mi,WIN_S_Avg_10mi,WIN_D_S_Max,TEM,DPT,GST_5cm,GST_10cm,GST_15cm,GST_20cm,GST_40Cm,GST_80cm,GST_160cm,GST_320cm,GST,LGST,RHU,VAP,PRE,Snow_Depth,EVP_Big,VIS_HOR_1MI,VIS_HOR_10MI,CLO_Cov,CLO_Height_LoM,NPRE_Conti_Max_EDay_Year,Q_PRS,Q_PRS_Sea,Q_WIN_D_INST,Q_WIN_S_INST,Q_WIN_D_Avg_1mi,Q_WIN_S_Avg_1mi,Q_WIN_D_Avg_2mi,Q_WIN_S_Avg_2mi,Q_WIN_D_Avg_10mi,Q_WIN_S_Avg_10mi,Q_WIN_D_S_Max,Q_TEM,Q_DPT,Q_GST_5cm,Q_GST_10cm,Q_GST_15cm,Q_GST_20cm,Q_GST_40Cm,Q_GST_80cm,Q_GST_160cm,Q_GST_320cm,Q_GST,Q_LGST,Q_RHU,Q_VAP,Q_PRE,Q_Snow_Depth,Q_VIS_HOR_1MI,Q_VIS_HOR_10MI,Q_CLO_Cov,Q_CLO_Height_LoM,PRS_Max,PRS_Max_OTime,PRS_Min,PRS_Min_OTime,TEM_Max,TEM_Max_OTime,TEM_Min,TEM_Min_OTime,WIN_S_Max,WIN_S_Max_OTime,WIN_D_INST_Max,WIN_S_Inst_Max,WIN_S_INST_Max_OTime,PRE_1h,RHU_Min,RHU_Min_OTIME,LGST_Max,LGST_Max_OTime,LGST_Min,LGST_Min_OTime,GST_Max,GST_Max_Otime,GST_Min,GST_Min_OTime,VIS_Min,VIS_Min_OTime,Q_PRS_Max,Q_PRS_Max_OTime,Q_PRS_Min,Q_PRS_Min_OTime,Q_TEM_Max,Q_TEM_Max_OTime,Q_TEM_Min,Q_TEM_Min_OTime,Q_WIN_S_Max,Q_WIN_S_Max_OTime,Q_WIN_D_INST_Max,Q_WIN_S_Inst_Max,Q_WIN_S_INST_Max_OTime,Q_PRE_1h,Q_RHU_Min,Q_RHU_Min_OTIME,Q_LGST_Max,Q_LGST_Max_OTime,Q_LGST_Min,Q_LGST_Min_OTime,Q_GST_Max,Q_GST_Max_Otime,Q_GST_Min,Q_GST_Min_OTime,Q_VIS_Min,Q_VIS_Min_OTime",\ 'timeRange':"time_range",\ 'orderby':"Day:ASC,Hour:ASC,Min:ASC",\ 'staIds':"54511",\ #'limitCnt':"10" } # 2.4 返回文件的格式 dataFormat = "csv" # 2.5 文件的本地全路径 savePath = "F:\lilijc\time_start.csv" # 3. 调用接口 result = client.callAPI_to_saveAsFile(userId, pwd, interfaceId, params, dataFormat, savePath) # 4. 输出接口 print (result.request) print (result.fileInfos) start_date=start_date+1
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值