水题 第三站 Leftmost Digit

本文介绍了一种新颖的方法,利用对数解决大数问题,具体为求解N^N的第一位数字。通过转换为对数形式,将问题简化为计算N*log10(N)的小数部分,并使用C++代码实现。

完全没想到要用对数解决这个问题,看了网上的思路觉得很妙,也学到了解决大数问题的一个新方法,在这里尝试解释一下。

求N^N的第一位数字是多少

取对数log10(N^N)=N*log10(N)

N^N=10^(N*log10(N))=10^N*10^log10(N)

因为10^M当M为整数时,第一位肯定是1,所以取决于N*log10(N)的小数部分,即m=N*log10(N)-(long long)N*log10(N);

要注意的细节很多

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;

int main ()
{
    int T;
    double a;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf",&a);
        double m = a*log10(1.0*a)-(long long)(a*log10(1.0*a));//此处注意a*log10(1.0*a)可能会超过int范围,虽然我也不明白为什么要将log10()里面的数转化为double类型
        printf("%d\n",(int)pow(10.0,m));
    }
    return 0;
}

  刚开始写log10()都写错了 = =,蠢哭

 

转载于:https://www.cnblogs.com/JiaoZha/p/7148044.html

#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "smg.h" #include "timer.h" #include "stm32f10x.h" // 共阴数字数组:0-9 + 空白 u8 smg_num[] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0x00}; // 全局变量 u8 phone_num[6] = {10, 10, 10, 10, 10, 10}; // 10表示空白 u8 display_buffer[6] = {10, 10, 10, 10, 10, 10}; u8 current_digits = 0; // 当前数字个数 u8 i; // 循环变量 // 扩展功能变量 u8 edit_mode = 0; // 0:正常模式, 1:修改模式 u8 edit_position = 0; // 当前修改位置(0-5) u32 flash_counter = 0; // 跳闪计数器 u8 flash_state = 0; // 跳闪状态(0:显示, 1:空白) // 按键定义 - 4×4矩阵键盘 #define KEY_NUM_0 0 #define KEY_NUM_1 1 #define KEY_NUM_2 2 #define KEY_NUM_3 3 #define KEY_NUM_4 4 #define KEY_NUM_5 5 #define KEY_NUM_6 6 #define KEY_NUM_7 7 #define KEY_NUM_8 8 #define KEY_NUM_9 9 #define KEY_BACK 10 // 退格键(*键) #define KEY_EDIT 11 // 修改键(#键) #define KEY_CONFIRM 12 // 确认键(D键) // 函数前置声明 void UpdateDisplay(void); void Key_GPIO_Init(void); u8 MatrixKey_Scan(void); void AddDigit(u8 digit); void BackspaceDigit(void); void EnterEditMode(void); void ExitEditMode(void); void ModifyDigit(u8 position, u8 new_digit); void MoveEditPosition(u8 direction); void ProcessKey(u8 key); // 更新显示缓冲区(处理跳闪效果) void UpdateDisplay(void) { for(i = 0; i < 6; i++) { if(edit_mode && i == edit_position) { // 修改模式下,当前编辑位置跳闪 display_buffer[i] = (flash_state == 0) ? phone_num[i] : 10; } else { // 正常显示 display_buffer[i] = phone_num[i]; } } } // 键盘扫描函数 void Key_GPIO_Init(void) { // 使能GPIOA时钟 RCC->APB2ENR |= 1<<2; // GPIOA时钟使能 // 配置PA0-PA3为推挽输出(行)- 50MHz GPIOA->CRL &= 0xFFFF0000; // 清除PA0-PA3配置 GPIOA->CRL |= 0x00003333; // PA0-PA3推挽输出,50MHz // 配置PA4-PA7为上拉输入(列) GPIOA->CRL &= 0x0000FFFF; // 清除PA4-PA7配置 GPIOA->CRL |= 0x88880000; // PA4-PA7上拉输入 // 设置PA4-PA7上拉 GPIOA->ODR |= 0x00F0; // PA4-PA7上拉 } // 改进的矩阵键盘扫描函数(非阻塞式) u8 MatrixKey_Scan(void) { static u8 key_pressed = 0; u8 row, col; u8 key_value = 0; // 扫描第一行(PA0=0) //BSRR 寄存器低16位是设置位(输出1) //BSRR 寄存器高16是复位位(输出0) GPIOA->BSRR = (1<<0)<<16; // PA0复位(输出0) GPIOA->BSRR = (1<<1) | (1<<2) | (1<<3); // PA1,PA2,PA3置位(输出1) delay_ms(1); col = (GPIOA->IDR >> 4) & 0x0F;//列在p4到p7 if((col & 0x0F) != 0x0F) { delay_ms(5); // 消抖 col = (GPIOA->IDR >> 4) & 0x0F;//重新读取 if((col & 0x0F) != 0x0F) { row = 0; if((col & 0x01) == 0) key_value = 1; // 1 else if((col & 0x02) == 0) key_value = 2; // 2 else if((col & 0x04) == 0) key_value = 3; // 3 else if((col & 0x08) == 0) key_value = KEY_BACK; // A作为退格 } } // 扫描第二行(PA1=0) GPIOA->BSRR = (1<<1)<<16; // PA1复位(输出0) GPIOA->BSRR = (1<<0) | (1<<2) | (1<<3); // PA0,PA2,PA3置位(输出1) delay_ms(1); col = (GPIOA->IDR >> 4) & 0x0F; if((col & 0x0F) != 0x0F) { delay_ms(5); col = (GPIOA->IDR >> 4) & 0x0F; if((col & 0x0F) != 0x0F) { row = 1; if((col & 0x01) == 0) key_value = 4 ; // 4 else if((col & 0x02) == 0) key_value = 5 ; // 5 else if((col & 0x04) == 0) key_value = 6 ; // 6 else if((col & 0x08) == 0) key_value = KEY_EDIT; // B作为修改 } } // 扫描第三行(PA2=0) GPIOA->BSRR = (1<<2)<<16; // PA2复位(输出0) GPIOA->BSRR = (1<<0) | (1<<1) | (1<<3); // PA0,PA1,PA3置位(输出1) delay_ms(1); col = (GPIOA->IDR >> 4) & 0x0F; if((col & 0x0F) != 0x0F) { delay_ms(5); col = (GPIOA->IDR >> 4) & 0x0F; if((col & 0x0F) != 0x0F) { row = 2; if((col & 0x01) == 0) key_value = 7; // 7 else if((col & 0x02) == 0) key_value = 8 ; // 8 else if((col & 0x04) == 0) key_value = 9; // 9 else if((col & 0x08) == 0) key_value = KEY_CONFIRM; // C作为确认 } } // 扫描第四行(PA3=0) GPIOA->BSRR = (1<<3)<<16; // PA3复位(输出0) GPIOA->BSRR = (1<<0) | (1<<1) | (1<<2); // PA0,PA1,PA2置位(输出1) delay_ms(1); col = (GPIOA->IDR >> 4) & 0x0F; if((col & 0x0F) != 0x0F) { delay_ms(5); col = (GPIOA->IDR >> 4) & 0x0F; if((col & 0x0F) != 0x0F) { row = 3; if((col & 0x01) == 0) key_value = KEY_NUM_0; // 0 // if((col & 0x02) == 0) key_value = 0; } } // 按键去重处理 if(key_value !=0) { if(key_pressed==0) { key_pressed = 1; return key_value; } } else { key_pressed = 0; } return 0; // 无按键 } // 初始化函数 void System_Init(void) { Stm32_Clock_Init(9); delay_init(72); uart_init(36, 115200); LED_SMG_Init(); LED_Init(); Key_GPIO_Init(); // 确保数码管初始化为全灭 for(i = 0; i < 6; i++) { LED_Write_Data(smg_num[10], i); } LED_Refresh(); TIM3_Init(19, 7199); // 定时器用于数码管扫描 } // 添加数字(从右侧进入)- 修正移位逻辑 void AddDigit(u8 digit) { if(current_digits < 6) { // 所有数字右移一位,新数字放最左侧 for(i = 0; i < 5;i++) { phone_num[i] =phone_num[i+1]; } phone_num[5] = digit; current_digits++; // printf("Added digit: %d, Total: %d\n", digit, current_digits); // 实时更新显示 UpdateDisplay(); } // else // { // printf("Phone number is full (6 digits)\n"); // } } // 退格功能 - 删除最左侧数字 void BackspaceDigit(void) { if(current_digits > 0) { // 所有数字左移一位,最右侧补空白 for(i = 0; i < 5; i++) { phone_num[i] = phone_num[i+1]; } phone_num[5] = 10; // 最右侧补空白 current_digits--; printf("Backspace, Total: %d\n", current_digits); // 实时更新显示 UpdateDisplay(); } else { printf("No digits to delete\n"); } } // 进入修改模式 void EnterEditMode(void) { if(current_digits > 0) { edit_mode = 1; edit_position = 0; // 从最左侧开始修改 flash_state = 0; flash_counter = 0; printf("Enter edit mode, position: %d\n", edit_position); // 实时更新显示以开始跳闪 UpdateDisplay(); } else { printf("No digits to edit!\n"); } } // 退出修改模式 void ExitEditMode(void) { edit_mode = 0; flash_state = 0; printf("Exit edit mode\n"); // 实时更新显示以停止跳闪 UpdateDisplay(); } // 修改指定位置的数字 void ModifyDigit(u8 position, u8 new_digit) { if(position < 6) { phone_num[position] = new_digit; // printf("Modified position %d to %d\n", position, new_digit); // 实时更新显示 UpdateDisplay(); } } // 移动修改位置 void MoveEditPosition(u8 direction) // 0:左移, 1:右移 { if(direction == 0) // 左移 { if(edit_position > 0) { edit_position--; // printf("Edit position moved LEFT to: %d\n", edit_position); } else { // printf("Already at leftmost position\n"); } } else // 右移 { if(edit_position < 5) { edit_position++; // printf("Edit position moved RIGHT to: %d\n", edit_position); } else { // printf("Already at rightmost position\n"); } } flash_state = 0; flash_counter = 0; // 实时更新显示 UpdateDisplay(); } // 处理按键事件 void ProcessKey(u8 key) { if(key == 0) return; // 无按键 // printf("Key pressed: %d\n", key); if(edit_mode) { // 修改模式下的按键处理 switch(key) { case KEY_NUM_0: case KEY_NUM_1: case KEY_NUM_2: case KEY_NUM_3: case KEY_NUM_4: case KEY_NUM_5: case KEY_NUM_6: case KEY_NUM_7: case KEY_NUM_8: case KEY_NUM_9: ModifyDigit(edit_position, key); break; case KEY_BACK: MoveEditPosition(0); // 左移编辑位置 break; case KEY_EDIT: MoveEditPosition(1); // 右移编辑位置 break; case KEY_CONFIRM: ExitEditMode(); break; default: // printf("Unknown key in edit mode: %d\n", key); break; } } else { // 正常模式下的按键处理 switch(key) { case KEY_NUM_0: case KEY_NUM_1: case KEY_NUM_2: case KEY_NUM_3: case KEY_NUM_4: case KEY_NUM_5: case KEY_NUM_6: case KEY_NUM_7: case KEY_NUM_8: case KEY_NUM_9: AddDigit(key); break; case KEY_BACK: BackspaceDigit(); break; case KEY_EDIT: EnterEditMode(); break; case KEY_CONFIRM: // 在正常模式下,确认键无作用 // printf("Confirm key pressed in normal mode (no effect)\n"); break; default: // printf("Unknown key in normal mode: %d\n", key); break; } } } // 主函数 int main(void) { System_Init(); // printf("=== Dial System Started ===\n"); // printf("Press number keys (0-9) to input digits\n"); // printf("Press * key to delete last digit (Backspace)\n"); // printf("Press # key to enter edit mode\n"); // printf("Press D key to exit edit mode\n"); // printf("In edit mode: Use * to move left, # to move right, numbers to modify\n"); while(1) { u8 key = MatrixKey_Scan(); // 只有在有按键按下时才处理 if(key != 0) { ProcessKey(key); } // 处理跳闪效果 if(edit_mode) { flash_counter++; if(flash_counter >= 250) // 每500ms切换一次 (2ms*250=500ms) { flash_counter = 0; flash_state = !flash_state; // 更新显示以反映跳闪状态变化 UpdateDisplay(); } } delay_ms(2); // 主循环延时 } } // 数码管显示中断服务函数 u8 smg_wei = 0; void TIM3_IRQHandler(void) { if(TIM3->SR & 0X0001) { // 显示当前缓冲区的数字 u8 num_to_show = display_buffer[smg_wei]; LED_Write_Data(smg_num[num_to_show], smg_wei); LED_Refresh(); smg_wei++; if(smg_wei >= 6) smg_wei = 0; TIM3->SR &= ~(1 << 0); } } 根据原理图在这串代码的基础上加一些功能实现简易密码锁的制作
12-12
这个是完整源码 python实现 Flask,Vue 【python毕业设计】基于Python的Flask+Vue物业管理系统 源码+论文+sql脚本 完整版 数据库是mysql 本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值