Problem 50

问题描述:

 

The prime 41, can be written as the sum of six consecutive primes:

41 = 2 + 3 + 5 + 7 + 11 + 13

This is the longest sum of consecutive primes that adds to a prime below one-hundred.

The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.

Which prime, below one-million, can be written as the sum of the most consecutive primes?


解决问题:

 

 

package projecteuler;

import java.util.Arrays;

public class Problem50 {

	public static boolean[] prime = new boolean[1000000];

	public static boolean IsPrime(long number) {

		for (int i = 2; i * i <= number; i++) {
			if (number % i == 0)
				return false;
		}
		return true;
	}

	public static void main(String[] args) {
		Arrays.fill(prime, false);
		int[] elements = new int[1000000];
		Arrays.fill(elements, 0);
		int index = 0;
		for (int i = 2; i < 1000000; i++) {
			if (IsPrime(i)) {
				prime[i] = true;
				elements[index] = i;
				index++;
			}
		}

		int len = 0;
		int sum = 0;
		int max = 0;
		for (int i = 0; i < index; i++) {
			sum = 0;
			for(int j =i; j<index; j++){
				sum += elements[j];
				if (sum > 1000000) {
					break;
				}
				if (sum<1000000&&prime[sum]) {
					if (len < j-i) {
						len = j-i;
						max = sum;
//						System.out.println("I:"+i+",J:"+j+",Sum:"+sum);
					}
				}
			}
		}
		System.out.println("Max:"+max);
		
	}

}

 

### 关于C++中的字符串问题 在C++编程中,处理字符串是一个常见的需求。虽然现代C++提供了`std::string`类来简化字符串操作[^1],但在某些情况下可能仍然需要使用传统的字符数组(即C风格字符串)。以下是关于如何在C++中有效处理字符串的一些核心概念。 #### 字符串的基础定义 C++并未原生支持字符串作为基本数据类型,而是通过标准库中的`std::string`类或者字符数组实现字符串功能[^2]。对于简单的应用,可以采用以下方式声明并初始化一个字符串: ```cpp #include <iostream> #include <string> int main() { // 使用 std::string 定义字符串 std::string str = "Hello, world!"; // 输出字符串 std::cout << str << std::endl; return 0; } ``` 如果需要手动管理内存,则可以选择字符数组的方式: ```cpp char charArray[50]; strcpy(charArray, "This is a C-style string."); std::cout << charArray << std::endl; ``` 上述代码展示了两种不同的方法用于表示字符串:一种是利用标准模板库(STL)中的`std::string`对象;另一种则是基于固定大小的字符数组配合函数如`strcpy()`完成赋值操作。 #### 查找子序列的功能实现 针对特定的需求——在一个源字符串中查找目标子序列的位置,并返回指向该位置的指针,可编写如下辅助函数[^3]: ```cpp const char* findSubsequence(const char* source, const char* obj){ while(*source != '\0'){ const char *s = source; const char *o = obj; while (*s == *o && *o != '\0') { s++; o++; } if (*o == '\0') return source; source++; } return nullptr; // 如果未找到匹配项则返回 NULL } // 测试用例 int main(){ const char src[]="hello world"; const char subseq[]="world"; const char* result=findSubsequence(src,subseq); if(result!=nullptr){ printf("Found at position %ld\n",result-src); }else{ puts("Not Found"); } return 0; } ``` 此段程序实现了从指定的`source`字符串里寻找是否存在连续的一组字符等于给定的目标序列(`obj`),一旦发现就立即停止搜索并将起始地址反馈回去。 #### 套接字通信中的端口重用机制 当涉及到网络应用程序开发时,可能会遇到因先前连接尚未完全释放而导致新创建的服务无法绑定到所需端口号的情况。此时可通过设置套接口选项SO_REUSEADDR来规避此类冲突现象的发生[^4]。下面给出一段示范代码片段说明其具体运用场景: ```cpp #include <sys/socket.h> #include <netinet/in.h> void setSocketOptions(int sockfd){ int optval=1; setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval)); } int createServerSocket(short portNum){ struct sockaddr_in serv_addr; bzero((char*)&serv_addr,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(portNum); serv_addr.sin_addr.s_addr = INADDR_ANY; int serverSockfd=socket(AF_INET, SOCK_STREAM, 0); setSocketOptions(serverSockfd); bind(serverSockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); listen(serverSockfd,5); return serverSockfd; } ``` 以上例子解释了怎样配置服务器端监听描述符使其能够重复使用本地地址/端口组合,从而加快调试周期以及提高资源利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值