// GetWanShu.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "omp.h"
#include <Windows.h>
#include "time.h"
//函数声明
void getWanShuBySection();
void getWanShu();
void getWanShuByReduction();
int _tmain(int argc, _TCHAR* argv[])
{
//串行实现求完数
clock_t start_LiXingLe=clock();
getWanShu();
clock_t end_LiXingLe=clock();
double chuanxingTime_LXL=end_LiXingLe-start_LiXingLe;
printf(" 串行时间为:%f\n",chuanxingTime_LXL);
//section 并行方法实现
getWanShuBySection();
//Reduction 并行方法实现
getWanShuByReduction(); //for 并行方法实现
omp_set_num_threads(4); start_LiXingLe=clock();
#pragma omp parallel
#pragma omp for for (int n = 1; n <= 10000; n++)
{
int sum = 0; for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
} end_LiXingLe=clock();
double parallelTime_LXL=end_LiXingLe-start_LiXingLe;
printf(" for并行时间为 :%f\n",parallelTime_LXL);
printf("for加速比为:%f\n",chuanxingTime_LXL/ parallelTime_LXL); return 0;
}
void getWanShuBySection(){ omp_set_num_threads(4); clock_t start_LiXingLe=clock();
#pragma omp parallel
{
#pragma omp sections
{ #pragma omp section
for (int n = 1; n < 2500; n++)
{
int sum = 0;
for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
}
#pragma omp section
for (int n = 2500; n < 5000; n++)
{
int sum = 0;
for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
}
#pragma omp section
for (int n = 5000; n <= 7500; n++)
{
int sum = 0;
for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
}
#pragma omp section
for (int n = 7500; n <= 10000; n++)
{
int sum = 0;
for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
} } } clock_t end_LiXingLe=clock();
printf(" section并行时间为 :%d\n",end_LiXingLe-start_LiXingLe); }
void getWanShu(){ for (int n = 1; n <= 10000; n++)
{
int sum = 0;
for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
} } void getWanShuByReduction(){ omp_set_num_threads(5); clock_t start_LiXingLe=clock();
for (int n = 1; n <= 10000; n++)
{
int sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 1; i <= (n/2); i++) //除到原来一半就可以了
{
if (n % i == 0)
{
sum += i;
}
}
if (sum == n)
{
printf ("%d\n", sum);
}
}
clock_t end_LiXingLe=clock();
printf(" reduction并行时间为 :%d\n",end_LiXingLe-start_LiXingLe); }




运行结果:

openmp 并行求完数的更多相关文章

  1. 帮初学者改代码——playerc之“练习:求完数问题”(下)

    前文链接:帮初学者改代码——playerc之“练习:求完数问题”(上) 再来看看be_ferfect()应该如何改. be_ferfect()函数的功能是判断number是否为完数,同时把因子对写入d ...

  2. 帮初学者改代码——playerc之“练习:求完数问题”(上)

    原文:“练习:求完数问题” 原代码: // #include <stdio.h> #include <stdlib.h> #include <math.h> #de ...

  3. Java50道经典习题-程序9 求完数

    题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. public class Prog9 { public stati ...

  4. 蓝桥杯 算法训练 ALGO-152 8-2求完数

     算法训练 8-2求完数   时间限制:50.0s   内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例 ...

  5. JAVA 基础编程练习题9 【程序 9 求完数】

    9 [程序 9 求完数] 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如 6=1+2+3.编程找出 1000 以内的 所有完数. package cskaoyan ...

  6. Java实现 蓝桥杯VIP 算法训练 求完数

    问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例输出 与上面的样例输入对应的输出. 例: 数据规模和约定 1-9999 publi ...

  7. OpenMP求完数

    源代码: #include "stdafx.h" //必须写在首行,因为其前面的include都会被忽略 #include "omp.h" #include & ...

  8. ALGO-152_蓝桥杯_算法训练_8-2求完数

    记: 掌握完数的概念 AC代码: #include <stdio.h> int main(void) { int i,j,sum; ; i <= ; i ++) { sum = ; ...

  9. Problem09 求完数

    题目:一个数如果恰好等于它的因子之和,这个数就称为"完数". 分析:例如6=1+2+3. 编程找出1000以内的所有完数. 假如整数n除以m,结果是无余数的整数,那么我们称m就是n ...

随机推荐

  1. linux中怎样从底部向上查看log文件

    对于一些很大的log文件,我们用more查看时会很费劲,没有办法直接跳到末尾再向前查看. 我们可以用less来解决,less查看一个文件时,可以使用类似vi的command命令,在command模式下 ...

  2. 【转】IOS开发:[1]Xcode5界面入门

    ios开发离不开xcode,这篇以xcode5界面来介绍一下xcode的界面都有哪些内容. 工具/原料 xcode5 整体来看区域有哪些? 1 首先我们先整体来看一下,xcode5界面可以分为五大主要 ...

  3. Eclipse无法识别小米2S手机

    某日,发现小米2S手机调试程序,发现Eclipse识别不出该硬件设备. 最后,确认小米2S系统升级后,会把开发者选项-USB调试选项默认关闭,打开即可. ----------------------补 ...

  4. c排序算法大全

    排序算法是一种基本并且常用的算法.由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高. 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示.在后面将给出详细的说明.& ...

  5. 可接受多个值的文件上传字段HTML5新特性

    <input type="file" id="input"  multiple="multiple"> 主要是多了个multip ...

  6. MVC和WebApi 使用get和post 传递参数。

    我们总结一下用js请求服务器的传参方法. Get方式 Get主要是用来查询,一般分为无参,一个参数,多个参数,实体对象参数. 1.无参 //Get没有参数 var get_f1 = function( ...

  7. vector.resize 与 vector.reserve的区别 .xml

    pre{ line-height:1; color:#9f1d66; background-color:#a0ffc0; font-size:16px;}.sysFunc{color:#5d57ff; ...

  8. Autodesk Stingray 游戏引擎

    Autodesk的游戏引擎质量够高的. http://v.youku.com/v_show/id_XMTMwMjc0MDIwMA==.html?qq-pf-to=pcqq.group http://v ...

  9. mysql数据库修改密码

    更改MySQL用户密码 方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password(' ...

  10. .net/c#连接sqlserver

    Webconfig代码 <configuration> <appSettings> <add key="myconnect" value=" ...