SY3-1-Calculate

该程序实现了给定一个正整数,通过不断除以其非1最小因子并计数,直至变为1的过程。样例中,输入12经过两次操作(12->6->1)得出答案。程序使用了链表存储中间结果,并利用质数判断辅助运算,适用于数据范围小于10^12的整数。

题目描述:

给定一个整数,每次除以它非1的最小因子,若除完不为1,则+1,问几次后变为1

样例输入:

12

样例输出

2

样理解释:

12-> (6 -> 7) -> (1)

数据范围:

输入的数字为正整数且小于10^12

# include<stdio.h>
# include<stdlib.h>
# include<math.h>
/*给定一个整数,每次除以它非1的最小因子,
若除完不为1,则+1,问几次后变为1
样例输入:
12
样例输出
2
样理解释:
12-> (6 -> 7) -> (1)
数据范围:
输入的数字为正整数且小于10^12*/
typedef struct Node
{
	long int num;
	struct Node* link;
}node;

int prime(long int a)
{
	long int temp;
	int flag = 0;
	for(long int i =2; i < sqrt(a); i ++)
	{
		if(a % i == 0)
		{
		 flag = 1;
		 break;
		}	
	} 
	return flag;
}
int main()
{
	int times = 0, i;
	long int temp = 0;
	node * head;
	head = (node*)malloc(sizeof(node));
	head -> link = NULL;
	
	node * p;
	p = (node*)malloc(sizeof(node));
	scanf("%ld", &(*p).num);
	p -> link = head -> link;
	head -> link = p;
	if(prime(p ->num)==0 && p -> num >=2)
	{
		times = 1;
		goto exit;
	}
	
	
	while((*p).num != 1)
	{
		for(i = 2; p -> num % i != 0; i ++)
		{
		}
		temp = p -> num / i;
		times += 1;
		p = (node*)malloc(sizeof(node));
		p -> num = temp;
		p -> link = head -> link;
		head -> link = p;
		
		if(p -> num != 1)
		{
			p = (node*)malloc(sizeof(node));
			p -> num = temp + 1;
			head -> link = p;
		}
		else
		{
			break;
		}
	}
	exit:
	printf("%d\n", times);
	return 0;
}

*&---------------------------------------------------------------------* *& Report ZTEXT03 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZTEXT03. * 定义数据类型 TYPES: BEGIN OF ty_sflight, carrid TYPE s_carr_id, connid TYPE s_conn_id, fldate TYPE s_date, price TYPE s_price, currency TYPE s_currcode, planetype TYPE s_planetye, seatsmax TYPE s_seatsmax, seatsocc TYPE s_seatsocc, END OF ty_sflight. data lv_c TYPE i VALUE 1. * 定义内表和变量 DATA: gt_sflight TYPE TABLE OF ty_sflight, gt_output TYPE TABLE OF ty_sflight, " 当前页显示的数据 gs_layout TYPE lvc_s_layo, gt_fieldcat TYPE lvc_t_fcat. *DATA LV_C TYPE I VALUE 1. DATA: gv_current_page TYPE i VALUE 1, " 当前页码 gv_page_size TYPE i VALUE 100, " 每页显示行数 gv_total_pages TYPE i, " 总页数 gv_total_records TYPE i. " 总记录数 DATA GT_light TYPE STANDARD TABLE OF ty_sflight WITH HEADER LINE. * 选择屏幕 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS: p_max TYPE i DEFAULT 1000 OBLIGATORY. SELECT-OPTIONS: s_carrid FOR GT_light-carrid. SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002. PARAMETERS: p_pagesz TYPE i DEFAULT 100 OBLIGATORY. " 每页大小 SELECTION-SCREEN END OF BLOCK b2. * 主程序 START-OF-SELECTION. PERFORM get_all_data. PERFORM calculate_paging. PERFORM get_current_page_data. PERFORM display_alv. *&---------------------------------------------------------------------* *& Form GET_ALL_DATA *&---------------------------------------------------------------------* FORM get_all_data. SELECT carrid, connid, fldate, price, currency, planetype, seatsmax, seatsocc FROM sflight UP TO @p_max ROWS INTO TABLE @gt_sflight WHERE carrid IN @s_carrid. IF gt_sflight IS INITIAL. MESSAGE &#39;No flight data found!&#39; TYPE &#39;I&#39; DISPLAY LIKE &#39;E&#39;. STOP. ENDIF. gv_total_records = lines( gt_sflight ). ENDFORM. " GET_ALL_DATA *&---------------------------------------------------------------------* *& Form CALCULATE_PAGING *&---------------------------------------------------------------------* FORM calculate_paging. gv_page_size = p_pagesz. " 计算总页数 gv_total_pages = gv_total_records DIV gv_page_size. IF gv_total_records MOD gv_page_size > 0. gv_total_pages = gv_total_pages + 1. ENDIF. " 确保当前页码在有效范围内 IF gv_current_page > gv_total_pages. gv_current_page = 1. ENDIF. ENDFORM. " CALCULATE_PAGING *&---------------------------------------------------------------------* *& Form GET_CURRENT_PAGE_DATA *&---------------------------------------------------------------------* FORM get_current_page_data. DATA: lv_start_index TYPE i, lv_end_index TYPE i. *lv_c = lv_c + 1. CLEAR gt_output. " 计算当前页数据的起始和结束索引 lv_start_index = ( gv_current_page - 1 ) * gv_page_size + 1. lv_end_index = lv_start_index + gv_page_size - 1. " 确保结束索引不超过总记录数 IF lv_end_index > gv_total_records. lv_end_index = gv_total_records. ENDIF. " 提取当前页的数据 APPEND LINES OF gt_sflight FROM lv_start_index TO lv_end_index TO gt_output. ENDFORM. " GET_CURRENT_PAGE_DATA *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* FORM display_alv. PERFORM build_field_catalog. PERFORM set_layout. CALL FUNCTION &#39;REUSE_ALV_GRID_DISPLAY_LVC&#39; EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = &#39;SET_PF_STATUS&#39; " 设置工具栏 i_callback_user_command = &#39;HANDLE_USER_COMMAND&#39; " 处理用户命令 is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat TABLES t_outtab = gt_output EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form BUILD_FIELD_CATALOG *&---------------------------------------------------------------------* FORM build_field_catalog. DATA: ls_fieldcat TYPE lvc_s_fcat. DEFINE add_field. CLEAR ls_fieldcat. ls_fieldcat-fieldname = &1. ls_fieldcat-ref_table = &2. ls_fieldcat-ref_field = &3. ls_fieldcat-reptext = &4. ls_fieldcat-coltext = &5. ls_fieldcat-outputlen = &6. APPEND ls_fieldcat TO gt_fieldcat. END-OF-DEFINITION. add_field: &#39;CARRID&#39; &#39;SFLIGHT&#39; &#39;CARRID&#39; &#39;Airline&#39; &#39;Airline&#39; 3, &#39;CONNID&#39; &#39;SFLIGHT&#39; &#39;CONNID&#39; &#39;Connection&#39; &#39;Conn&#39; 4, &#39;FLDATE&#39; &#39;SFLIGHT&#39; &#39;FLDATE&#39; &#39;Flight Date&#39; &#39;Date&#39; 8, &#39;PRICE&#39; &#39;SFLIGHT&#39; &#39;PRICE&#39; &#39;Price&#39; &#39;Price&#39; 12, &#39;CURRENCY&#39; &#39;SFLIGHT&#39; &#39;CURRENCY&#39; &#39;Currency&#39; &#39;Curr&#39; 5, &#39;PLANETYPE&#39; &#39;SFLIGHT&#39; &#39;PLANETYPE&#39; &#39;Aircraft Type&#39; &#39;Aircraft&#39; 10, &#39;SEATSMAX&#39; &#39;SFLIGHT&#39; &#39;SEATSMAX&#39; &#39;Max Seats&#39; &#39;Max Seats&#39; 8, &#39;SEATSMAX&#39; &#39;SFLIGHT&#39; &#39;SEATSOCC&#39; &#39;Occupied Seats&#39; &#39;Occupied&#39; 8. ENDFORM. " BUILD_FIELD_CATALOG *&---------------------------------------------------------------------* *& Form SET_LAYOUT *&---------------------------------------------------------------------* FORM set_layout. gs_layout-zebra = &#39;X&#39;. " 斑马线模式 gs_layout-cwidth_opt = &#39;X&#39;. " 列宽优化 gs_layout-sel_mode = &#39;A&#39;. " 选择模式 gs_layout-info_fname = &#39;COLOR&#39;. " 行颜色字段(如果需要) " 设置网格标题显示分页信息 gs_layout-grid_title = |Flight Data - Page { gv_current_page } of { gv_total_pages } - Total Records: { gv_total_records }|. ENDFORM. " SET_LAYOUT *&---------------------------------------------------------------------* *& Form SET_PF_STATUS *&---------------------------------------------------------------------* FORM set_pf_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS &#39;ZALV_PAGING_STATUS&#39;. ENDFORM. " SET_PF_STATUS *&---------------------------------------------------------------------* *& Form HANDLE_USER_COMMAND *&---------------------------------------------------------------------* FORM handle_user_command USING r_ucomm TYPE sy-ucomm rs_selfield TYPE slis_selfield. * *&---刷新屏幕数据到内表 DATA: lr_grid1 TYPE REF TO cl_gui_alv_grid. CALL FUNCTION &#39;GET_GLOBALS_FROM_SLVC_FULLSCR&#39; IMPORTING e_grid = lr_grid1. CALL METHOD lr_grid1->check_changed_data. CASE r_ucomm. WHEN &#39;FIRST_PAGE&#39;. " 第一页 gv_current_page = 1. PERFORM refresh_display. WHEN &#39;PREV_PAGE&#39;. " 上一页 IF gv_current_page > 1. gv_current_page = gv_current_page - 1. PERFORM refresh_display. ELSE. MESSAGE &#39;Already on first page!&#39; TYPE &#39;S&#39;. ENDIF. WHEN &#39;NEXT_PAGE&#39;. " 下一页 IF gv_current_page < gv_total_pages. gv_current_page = gv_current_page + 1. PERFORM refresh_display. ELSE. MESSAGE &#39;Already on last page!&#39; TYPE &#39;S&#39;. ENDIF. WHEN &#39;LAST_PAGE&#39;. " 最后一页 gv_current_page = gv_total_pages. PERFORM refresh_display. WHEN &#39;REFRESH&#39;. " 刷新 PERFORM refresh_display. WHEN &#39;BACK&#39; OR &#39;CANCEL&#39; OR &#39;EXIT&#39;. " 退出 CLEAR r_ucomm. LEAVE TO transaction &#39;SESSION_MANAGER&#39;. * SET SCREEN 0. LEAVE SCREEN. ENDCASE. * *&---调用后数据保存处理 CALL FUNCTION &#39;GET_GLOBALS_FROM_SLVC_FULLSCR&#39; IMPORTING e_grid = lr_grid1. CALL METHOD lr_grid1->check_changed_data. *&---刷新ALV 显示值 rs_selfield-refresh = &#39;X&#39; . ENDFORM. *&---------------------------------------------------------------------* *& Form REFRESH_DISPLAY *&---------------------------------------------------------------------* FORM refresh_display. DATA LV_MES TYPE STRING. PERFORM get_current_page_data. LV_MES = &#39;当前页数第&#39; && gv_current_page && &#39;/ &#39; && gv_total_pages. MESSAGE LV_MES TYPE &#39;S&#39;. ENDFORM. " REFRESH_DISPLAY
10-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值