算法系列——求1+2+3+...+n

题目描述

求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

解题思路

可以利用pow()方法和移位运算

利用求和公式 (1+n)*n/2= (n²+n)>>1

利用递归和短路求值原理

int sum=n;
sum>0&&((sum+=sum(n-1))>0)

程序实现

pow()方法和移位运算

 public int Sum_Solution(int n) {
       n=(int)(Math.pow(n,2)+n)>>1;

       return n;
    }

利用递归和短路求值原理

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我已经明白您的步骤,下面是C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define PAGE_SIZE 1024 // 页面大小,这里设置为1KB #define MAX_PAGE_TABLE_SIZE 64 // 页表最大长度 #define FIFO 0 // 页面淘汰算法,这里选用FIFO算法 // 页表项 typedef struct { int page_num; // 页号 int frame_num; // 帧号 int valid; // 有效位,表示该页是否在主存中 int access_time; // 访问时间,用于实现FIFO算法 } PageTableEntry; // 计算一个地址所在的页号 int get_page_num(int address) { return address / PAGE_SIZE; } // 初始化页表 void init_page_table(PageTableEntry* page_table) { for (int i = 0; i < MAX_PAGE_TABLE_SIZE; i++) { page_table[i].page_num = -1; page_table[i].frame_num = -1; page_table[i].valid = 0; page_table[i].access_time = -1; } } // 查找某个页在页表中的位置 int find_page(PageTableEntry* page_table, int page_num) { for (int i = 0; i < MAX_PAGE_TABLE_SIZE; i++) { if (page_table[i].valid && page_table[i].page_num == page_num) { return i; } } return -1; } // 查找可用的页表项 int find_free_page_table_entry(PageTableEntry* page_table) { for (int i = 0; i < MAX_PAGE_TABLE_SIZE; i++) { if (!page_table[i].valid) { return i; } } return -1; } // 按FIFO算法淘汰一页 int evict_page(PageTableEntry* page_table) { int oldest_page_index = 0; int oldest_access_time = page_table[0].access_time; for (int i = 1; i < MAX_PAGE_TABLE_SIZE; i++) { if (page_table[i].valid && page_table[i].access_time < oldest_access_time) { oldest_page_index = i; oldest_access_time = page_table[i].access_time; } } page_table[oldest_page_index].valid = 0; return page_table[oldest_page_index].frame_num; } int main() { int page_table_size; // 页表大小 printf("请输入页表大小(不超过%d):", MAX_PAGE_TABLE_SIZE); scanf("%d", &page_table_size); // 初始化页表 PageTableEntry* page_table = (PageTableEntry*)malloc(sizeof(PageTableEntry) * page_table_size); init_page_table(page_table); // 产生一个需要访问的指令地址流 int address_stream[1024]; srand(time(NULL)); for (int i = 0; i < 1024; i++) { address_stream[i] = rand() % (1024 * 1024); } int page_fault_count = 0; // 缺页中断次数 int frame_count = 0; // 主存中的帧数 int access_count = 0; // 访问的地址数量 for (int i = 0; i < 1024; i++) { int page_num = get_page_num(address_stream[i]); int page_index = find_page(page_table, page_num); if (page_index == -1) { // 该页不在主存中 if (frame_count < MAX_PAGE_TABLE_SIZE) { // 主存中还有空闲帧 int frame_num = frame_count++; int page_table_entry_index = find_free_page_table_entry(page_table); page_table[page_table_entry_index].page_num = page_num; page_table[page_table_entry_index].frame_num = frame_num; page_table[page_table_entry_index].valid = 1; page_table[page_table_entry_index].access_time = access_count++; printf("缺页中断:页%d调入帧%d\n", page_num, frame_num); page_fault_count++; } else { // 主存中没有空闲帧,按FIFO算法淘汰一页 int evicted_frame_num = evict_page(page_table); int page_table_entry_index = find_free_page_table_entry(page_table); page_table[page_table_entry_index].page_num = page_num; page_table[page_table_entry_index].frame_num = evicted_frame_num; page_table[page_table_entry_index].valid = 1; page_table[page_table_entry_index].access_time = access_count++; printf("缺页中断:页%d调入帧%d,淘汰页%d\n", page_num, evicted_frame_num, page_table[page_table_entry_index].page_num); page_fault_count++; } } else { // 该页已经在主存中 page_table[page_index].access_time = access_count++; } } printf("访问的地址数量:%d\n", access_count); printf("缺页中断的次数:%d\n", page_fault_count); free(page_table); return 0; } ``` 这个代码实现了一个动态页式存储管理程序,可以根据您的需要进行修改和扩展。如果您还有其他问题或需,欢迎随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值