华为机试——将一个数分解成两个质数之和

题目描述

* 题目描述:数字分解,将一个数字分解成两个质数相加
* 输入描述:给定数字
* 输出描述:两个质数之和
* 输入示例:10
* 输出示例:10=3+7

代码实现

/*************************************************
* 题目描述:数字分解,将一个数字分解成两个质数相加
* 输入描述:给定数字
* 输出描述:两个质数之和
* 输入示例:10
* 输出示例:10=3+7
* 注意事项:Linux下编译时需要连接库,编译参数:-lm
*************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include <math.h>

#define NUM_SIZE	100

int g_point = 0;

/* 判断一个数是否为质数(素数) */
/* 返回值:0:不是素数  1:是素数 */
int is_prime(int src)
{
	int  i;
    /* 两个较小数另外处理 */
    if(src ==2|| src==3 )
        return 1 ;
    /* 不在6的倍数两侧的一定不是质数 */ 
    if(src %6!= 1&&src %6!= 5)
        return 0 ;
	
    int tmp = sqrt( src);
    /* 在6的倍数两侧的也可能不是质数 */
    for(i= 5;i <=tmp; i+=6 )
	{
		if(src %i== 0||src %(i+ 2)==0 )
			return 0 ;
	}
	
    /* 排除所有,剩余的是质数 */
    return 1 ;
}

/* 将数字分解成两个质数 */
int div_num(int src,int* des)
{
	int i;
	
	for(i=2;i<sqrt(src);i++)
	{
		if(is_prime(i) && is_prime(src-i))
		{
			des[g_point] = i;
			g_point ++;
		}
	}
	
	return 0;
}

int main()
{
	int input=0;
	int* des;
	int i;
	
#ifdef DEBUG		
		printf("[提示]:输入一个数进行分解:");
#endif
	
	scanf("%d",&input);
	
	des = (int*)malloc(sizeof(int)*input);
	if(NULL == des)
	{
#ifdef DEBUG		
		printf("[Error]:malloc failed!\n\r");
#endif
		return -1;

	}
	memset(des,0,sizeof(des));
	div_num(input,des);

#ifdef DEBUG		
		printf(">>>>>>>>>>>> number div list <<<<<<<<<<<<<\n\r");
#endif
	
	for(i=0;i<g_point;i++)
	{
		printf("%d=%d+%d\n",input,des[i],input-des[i]);
	}
	
	return 0;
}

测试描述

注意事项

编译时,在Linux下注意编译选项要加-lm,即链接数学库。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要求实现一个,输入为两个字符串类型的超大整型,输出为它们相加后的字符串类型结果。 这个问题的难点在于超大整型的加法运算。由于Python语言天生支持大整运算,所以我们可以直接将两个超大整型转换成整型,然后标准的加法运算即可。但是,由于输入的是字符串类型的超大整型,我们需要先将它们转换成整型,同时需要考虑到进位的问题。具体实现可以参考以下代码: def add_str(s1: str, s2: str) -> str: # 先将字符串转换成列表并翻转 s1, s2 = list(s1[::-1]), list(s2[::-1]) res = [] # 用来保存结果的列表 carry = 0 # 用来保存进位的 while s1 or s2: # 当两个列表至少有一个非空时循环 # 将列表转换成整并将其加起来 num1 = int(s1.pop()) if s1 else 0 num2 = int(s2.pop()) if s2 else 0 s = num1 + num2 + carry # 计算进位 if s > 9: carry = 1 s -= 10 else: carry = 0 # 将结果插入列表 res.insert(0, s) # 如果最高位有进位,将其加上 if carry: res.insert(0, 1) # 将列表转换成字符串类型的结果并返回 return ''.join(str(i) for i in res) 以上代码首先将输入的字符串转换成列表并翻转,这样方便我们从低位开始加法运算。然后使用一个while循环将两个列表中的字按位相加,同时考虑到进位的情况。最后再将结果列表转换回字符串类型并返回即可。当然,如果要写一个更为严谨的程序,还需要考虑一些边界情况,比如输入为空字符串、输入的字符串中有非字字符等情况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值