当前位置:文档之家› 七种方法求水仙花数

七种方法求水仙花数

七种方法求水仙花数
七种方法求水仙花数

并行计算与多核多线程技术

课程报告

班级

学号

姓名

目录

1.水仙花数的并行算法设计与实现 (7)

1.1 .1功能描述

1.1.2 解决方案

1.2算法设计 (7)

1.2.1 串行算法设计

1.2.2并行算法设计

1.3 基于OpenMP的并行算法实现 (8)

1.3.1 代码及注释(变量名名字首字母开头)

1.3.2 执行结果截图(体现串行时间、并行时间和加速比)

1.3.3 遇到的问题及解决方案

1.4 基于MPI的并行算法实现 (11)

1.4.1 代码及注释(变量名名字首字母开头)

1.4.2 执行结果截图(体现串行时间、并行时间和加速比)

1.4.3 遇到的问题及解决方案

1.5 基于Java(Runnable)的并行算法实现 (13)

1.5.1 代码及注释(变量名名字首字母开头)

1.5.2 执行结果截图(体现串行时间、并行时间和加速比)

1.5.3 遇到的问题及解决方案

1.6 基于Windows(.NET)的并行算法实现 (20)

1.6.1 代码及注释(变量名名字首字母开头)

1.6.2 执行结果截图(体现串行时间、并行时间和加速比)

1.6.3 遇到的问题及解决方案

2. 理论基础 (22)

2.1 并行计算机体系结构、并行计算模型、并行算法的概念

2.2并行计算机体系结构、并行计算模型、并行算法的关系

2.3实例说明并行计算机体系结构、并行计算模型、并行算法的关系

评价实践效果(正确度/加速比)

理论基础

难度

工作量

独立性

认证结果

1.水仙花数的并行算法设计与实现

1.1 .1功能描述

水仙花数又称阿姆斯特朗数。是指一种三位数,其各个数之立方和等于该数本身。水仙花数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。

1.1.2 解决方案

并行思想:

并行计算的原理就是把一个任务或者作业分配到多个处理器上并发执行。这样一来可以大大提高计算的效率。在本次课题中,要实现水仙花数的并行计算输出,就是把制定范围内的数用多个处理器进行计算,从而得到水仙花数的并行输出。再和串行执行方法进行比较,观察其优越性。

核心算法:

int hundreds = n / 100;

int tens = n % 100 / 10;

int ones = n % 10;

Return cube(hundreds) + cube(tens) + cube(ones) == n;

1.2算法设计

1.2.1 串行算法设计

for(xlh=100;xlh<1000;xlh++)

{

j=xlh/100;

z=(xlh-100*j)/10;

t=xlh%10;

if(j*j*j+z*z*z+t*t*t==xlh)

printf("%d\n",xlh);

}

1.2.2 并行算法设计

for (int xlh=100+ id; xlh< 1000; xlh+=2) //1000以内的水仙花数

{

int j=xlh/100; //判断百位

int z=xlh%100/10;//判断十位

int t=xlh%10;//个位

if(j*j*j+z*z*z+t*t*t ==xlh)//确定是否是水仙花数

printf("%d\n",xlh);//输出水仙花数

}

1.3 基于OpenMP的并行算法实现

1.3.1 代码及注释(变量名名字首字母开头)

#include "stdafx.h"

#include "Windows.h"

#include "math.h"

#include

#include

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

printf("求水仙花数\n");

cout<<"并行结果:"<

clock_t t1=clock();//线程1

#pragma omp parallel for//并行开始

for(int i=100; i<1000; i++)//判断是否为水仙花数

{

int xlh=i/100;

int k=(i-100*xlh)/10;

int l=i%10;

Sleep(1);

if(xlh*xlh*xlh+k*k*k+l*l*l==i)

printf("%d\n",i);

}

clock_t t2=clock();//并行结束

double pt=t2-t1-0.0;

printf("并行时间%f\n",pt-0.0);//输出并行时间

clock_t t3=clock();//串行开始

for(int i=100; i<1000; i++)

{

int xlh=i/100;

int k=(i-100*xlh)/10;

int l=i%10;

Sleep(1);

if(xlh*xlh*xlh+k*k*k+l*l*l==i)

printf("%d\n",i);

}

clock_t t4=clock();//串行结束

double st=t4-t3-0.0;

printf("串行时间%f\n",st-0.0);

printf("加速比%f\n",st/pt);

system("pause");

return 0;

}

1.3.2 执行结果截图(体现串行时间、并行时间和加速比)

1.3.3 遇到的问题及解决方案

错误代码

int xlh,j,z,t,m,n;

int id=omp_get_thread_num();

omp_set_num_threads(NUM_THREADS);

clock_t t1=clock();

#pragma omp parallel

{

for(xlh=100+id;xlh<1000;xlh+=NUM_THREADS)//判断是否为水仙花数{

j=xlh/100;

z=(xlh-100*j)/10;

t=xlh%10;

if(j*j*j+z*z*z+t*t*t==xlh)

printf("%d\n",xlh);

}

}

clock_t t2=clock();

printf("并行时间%d\n",t2-t1);

printf("串行水仙花数:\n");

clock_t t3=clock();// for(xlh=100;xlh<1000;xlh++)

{

j=xlh/100;

z=(xlh-100*j)/10;

t=xlh%10;

if(j*j*j+z*z*z+t*t*t==xlh)

printf("%d\n",xlh);

}

clock_t t4=clock();

正确代码

int _tmain(int argc, _TCHAR* argv[])

{

printf("求水仙花数\n");

cout<<"并行结果:"<

clock_t t1=clock();//线程1

#pragma omp parallel for//并行开始

for(int i=100; i<1000; i++)//判断是否为水仙花数

{

int xlh=i/100;

int k=(i-100*xlh)/10;

int l=i%10;

Sleep(1);

if(xlh*xlh*xlh+k*k*k+l*l*l==i)

printf("%d\n",i);

}

clock_t t2=clock();//并行结束

double pt=t2-t1-0.0;

printf("并行时间%f\n",pt-0.0);//输出并行时间

clock_t t3=clock();//串行开始

for(int i=100; i<1000; i++)

{

int xlh=i/100;

int k=(i-100*xlh)/10;

int l=i%10;

Sleep(1);

if(xlh*xlh*xlh+k*k*k+l*l*l==i)

printf("%d\n",i);

}

clock_t t4=clock();//串行结束

分析

对并行算法设计不熟悉。逻辑混乱,写代码有错误。

1.4 基于MPI的并行算法实现

1.4.1 代码及注释(变量名名字首字母开头)

#include "stdafx.h"

#include

#include

int main(int argc,char * argv[])

{

int id,numpro;

double startime01,endtime01,startime02,endtime02;

MPI_Init (&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&id);

MPI_Comm_size(MPI_COMM_WORLD,&numpro);

startime01 =MPI_Wtime();

printf("水仙花数:\n");

if(id==0)//并行

for (int xlh=100+ id; xlh< 1000; xlh+=2) //1000以内的水仙花数

{

int j=xlh/100; //判断百位

int z=xlh%100/10;//判断十位

int t=xlh%10;//个位

if(j*j*j+z*z*z+t*t*t ==xlh)//确定是否是水仙花数

printf("%d\n",xlh);//输出水仙花数

}

if(id==0)

{

endtime01=MPI_Wtime();

printf("并行时间:%f\n",endtime01-startime01);//输出并行时间

}

if(id==0)//串行

{

startime02=MPI_Wtime();

printf("水仙花数:\n");

for (int xlh =100; xlh < 1000; xlh+=1)

{

int j=xlh/100;

int z=xlh%100/10;

int t=xlh%10;

if(j*j*j+z*z*z+t*t*t ==xlh)

printf("%d\n",xlh);

}

endtime02=MPI_Wtime();

printf("串行时间:%f\n",endtime02-startime02);

}

MPI_Finalize();

system("pause");

return 0;

}

1.4.2 执行结果截图(体现串行时间、并行时间和加速比)

1.4.3 遇到的问题及解决方案

后果

分析

环境配置错误,在配置MPI的环境时花了很多时间,在自己电脑上运行一直出错,后来在机房运行成功的。

1.5 基于Java(Runnable)的并行算法实现

1.5.1 代码及注释(变量名名字首字母开头)

import https://www.doczj.com/doc/f315377604.html,ng.Thread;

public class JavaThread extends Thread

{

private int start;

private int end;

private int sum=0;

public JavaThread(int start,int end)

{

super();

this.start=start;

this.end=end;

}

public void run()//并行函数

{

int a,b,c;

for(int xlh=start;xlh<=end;xlh+=2)

{

a=xlh/100;

b=(xlh-a*100)/10;

c=xlh%10;

try {

sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

if(a*a*a+b*b*b+c*c*c==xlh&&xlh>100&&xlh<1000) {

sum++;

System.out.println(xlh);

}

}

}

public int Flower() throws InterruptedException//串行函数 {

int a,b,c;

sum=0;

for(int xlh=start;xlh<=end;xlh++)//求水仙花数

{

a=xlh/100;

b=(xlh-a*100)/10;

c=xlh%10;

sleep(1);

if(a*a*a+b*b*b+c*c*c==xlh&&xlh>100&&xlh<1000)

{

sum++;

System.out.println(xlh);

}

}

return sum;

}

public int getSum()

{

return sum;

}

public static void main(String []args)throws InterruptedException {

JavaThread thread1=new JavaThread(1,1000);//确定开始以及结束值

JavaThread thread2=new JavaThread(2,1000);

System.out.println("并行结果:");

long startTime=System.currentTimeMillis();//并行开始

thread1.start();

thread2.start();

thread1.join();

thread2.join();

long endTime=System.currentTimeMillis();

System.out.println("并行时间:"+(endTime-startTime));

double t1=endTime-startTime;

startTime=System.currentTimeMillis();//并行结束

System.out.println("串行结果:");

JavaThread thread=new JavaThread(1,1000);

thread.Flower();

endTime=System.currentTimeMillis();

System.out.println("串行时间:"+(endTime-startTime));

double t2=endTime-startTime;

System.out.println("加速比"+t2/t1);

}

}

1.5.2 执行结果截图(体现串行时间、并行时间和加速比)

1.5.3 遇到的问题及解决方案

错误代码及后果

import https://www.doczj.com/doc/f315377604.html,ng.Thread;

class JavaThread extends Thread

{

private int start;

private int end;

private int sum=0;

public JavaThread(int start,int end)

{

super();

this.start=start;

this.end=end;

public void run()//并行函数

{

int a,b,c;

for(int xlh=start;xlh<=end;xlh+=2)

{

a=xlh/100;

b=(xlh-a*100)/10;

c=xlh%10;

try {

sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

后果:

输出结果错误.

分析:应声明表明JavaThread类继承 Thread类为公共类.正确代码

import https://www.doczj.com/doc/f315377604.html,ng.Thread;

public class JavaThread extends Thread

{

private int start;

private int end;

private int sum=0;

public JavaThread(int start,int end)

{

super();

this.start=start;

this.end=end;

}

public void run()//并行函数

{

int a,b,c;

for(int xlh=start;xlh<=end;xlh+=2)

{

a=xlh/100;

b=(xlh-a*100)/10;

c=xlh%10;

try {

sleep(1);

} catch (InterruptedException e) { e.printStackTrace();

}

分析

对C#编程掌握不熟悉。

1.6 基于Windows(.NET)的并行算法实现

1.6.1 代码及注释(变量名名字首字母开头)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Diagnostics;

class Threads

{

static void Main()

{

Stopwatch t1 = new Stopwatch();

Work work1 = new Work(0);

ThreadStart thread1 = new ThreadStart(work1.Work1);//调用work函数

Thread newthread1 = new Thread(thread1);

Work work2 = new Work(1);

ThreadStart thread2 = new ThreadStart(work2.Work1);

Thread newthread2 = new Thread(thread2);

Console.Write("并行结果:\n");

t1.Start();//并行开始

newthread1.Start();

newthread2.Start();

newthread1.XLHoin();

newthread2.XLHoin();

t1.Stop();//并行结束

TimeSpan timeSpan = t1.Elapsed;

double pt = timeSpan.TotalMilliseconds;

Console.Write("并行时间:{0}\n", pt);

Console.Write("串行结果:\n");

t1.Start();//串行开始

new Work(0).func();

t1.Stop();//串行结束

TimeSpan timeSpan2 = t1.Elapsed;

double st = timeSpan2.TotalMilliseconds;

Console.WriteLine("串行时间:{0}", st);

Console.WriteLine("加速比:{0}", st / pt);

Console.Read();

高级程序设计(实习基础类试题)

《高级程序设计》实习 基础类编程题目 (顺序结构类题目) 1、(数字处理)输入一个三位整数x(999=>x>=100),将其分解出百位、十位、各位,并求出各位之和以及各位之积。 2、要将"Program"译成密码,译码规律是:用原来字母后面的第5个字母代替原来的字母.例如,字母"A"后面第5个字母是"F"."F"代替"A"。 (选择结构类题目) 3、编程实现以下功能:读入两个运算数(data1和data2)及一个运算符(op),计算表达式data1op data2的值,其中op可为+,-,*,/(用switch语句实现)。 (题目可扩充到四则混合运算,可以将“+、-、*、\”以及“()”考虑进去) 4、编一程序,对于给定的一个百分制成绩,输出相应的五分值成绩。设90分以上为'A',80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'(用switch语句实现)。 (循环结构类题目) 5、求Sn=a+aa+aaa+------+aaaaaaa(n个a),其中a和n都从键盘中输入,如从键盘中输入2,5,则计算S5=2+22+222+2222+22222。 (要求使用三种循环语句分别完成) 6、韩信点兵。 韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。编程求韩信至少有多少兵? 7、打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 8、(穷举算法)古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2-1000内的所有完全数。 9、(穷举算法)(钱币问题)在日常生活中常常需要用一些较小面额的钱币去组合出一定的币值。现有面值为1元、2元和5元的钞票(假设每种钞票的数量都足够多),从这些钞票中取出30张使其总面值为100元,问有多少种取法?每种取法的各种面值的钞票各为多少张? (数组类题目) 10、已知一组字符串a[10]=”abCDefGHi”,将其中的小写字母改写成大写字母。 11、已知有20个两位正整数的数组a[20]={10,11,12,13,14,19,18,17,16,15,20,21,22,23,24,29,28,27,26,25},编一程,将数组a中满足:个位数加十位数是偶数的元素赋给数组b[],并对数组b[]从小到大排序打印。例:11,13。 12、(排序)已知有20个两位正整数的数组a[20]={10,11,12,13,14,19,18,17,16,15,20,21,22,23,24,29,28,27,26,25},从键盘输入上述数组a中的某个数,编写一程序,将该数从数组a中删除掉,将删除后该数的数组a打印。 (编程思路:需要考虑键盘输入的数在数组中的位置,可能的位置是输入的数值为10,刚好是数组第一个元素;可能是数组a中间的某个数值;可能是数组a最好一个数值25,整个处理都不相同)

C语言特殊数据的输出

特殊数据的输出 【涉及知识点】 1.函数的参数; 2.多分支条件语句; 3.循环; 4.数据的输入输出; 5.随机函数的使用。 【题目介绍】 请编写程序,由系统随机产生一个正整数n(1

特殊数据的输出(1)资料

《C程序设计》 课程设计报告(20 14 —2015 学年第2 学期) 题目:特殊数据的输出 学院:电气与电子信息学院 班级:1309 学号:1304080016 姓名:梁骞 指导教师:罗涛华 时间:起 4.27 止4.30

一、课程设计基本信息 课程代码:05190124 课程名称:计算机基础课程设计 课程英文名称: Computer-based Course Design 课程所属单位(院(系)、教研室):数学与计算机学院计算机基础课程群 课程面向专业:食品科学与工程学院、机械工程学院、电气与电子工程学院、土建学院、动物科学与营养工程学院、化学与环境工程学院、工商管理类、国际经济与贸易、旅游管理、金融学、行政管理、汉语言文学、英语、护理学、康复治疗专业、生物科学类、制药工程、制药工程(生物制药)、药物制剂、物流管理 课程类型:必修课 先修课程:大学计算机基础通识选修课程、程序设计课程 学分:1 总学时:1周 二、课程设计目标 掌握所学语言程序设计的方法,熟悉所学语言的开发环境及调试过程,熟悉所学语言中的数据类型,数据结构、语句结构、运算方法,巩固和加深对理论课中知识的理解,提高学生对所学知识的综合运用能力。通过综合设计要求达到下列基本技能:1.培养查阅参考资料、手册的自学能力,通过独立思考深入钻研问题,学会自己分析、解决问题。 2.通过对所选题目方案分析比较,确立方案,编制与调试程序,初步掌握程序设计的方法,能熟练调试程序。 3.系统设计编程简练,可用,功能全面,并有一定的容错能力。用户界面良好,有较好的输出功能。在完成课题基本要求后,具有创新型设计,具有一定的实用价值。 4.根据个人的设计调试过程,撰写设计报告。 三、课程设计内容 熟练掌握所学语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。 四、课程设计要求 1.要求每个同学都要认真对待,积极参与。 2.课程设计结束时,提交完成的所有源程序、相关文件和可执行文件。同时填写并完 成《课程设计报告册》。 3.不符合要求的程序、设计报告、抄袭的设计报告或源程序代码、在设计中完全未参 与的将作不及格处理。 五、考核方式 指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神

水仙花数算法研究及其C语言代码实现

/** 水仙花数算法研究及其C语言代码实现 'BnBn-1...B1'=X(N)= sum{ digit = 0..9, count_digit[digit] * power(digit, N)} @author 东海陈光剑剑魔书仙读书录 水仙花数的相关数学证明及其算法&源程序实现 The Computer Solution Of Narcissistic Number & Mathematical Proofs 东海陈光剑剑魔书仙读书录 2013.4.28 @ iSoftStone [参数说明] N(n):n位十进制正整数N(n) MAX(n):n位十进制正整数最大值10 n -1 MIN(n):n位十进制正整数最大值10 n-1 Nar(n):n位十进制正整数中的水仙花数 b n-1,b n-2,...,b 1,b 0:N(n)各位十进制数位上的数字,显然b n-1>0. k 0 ,k 1 ,...,k 9 : N(n)中数字0,1,2,...,9 分别总计出现的次数. 显然k i >=0 & sum(k i )=n. k 0 *0^n + k 1 *1^n + ...+ k 9 * 9^n =N(n). (i=0,1,2 (9) 穷举所有十元组(k 0 ,k 1 ,...,k 9 ); 对满足条件[*]的一个特定的十元组(k 0 ,k 1 ,...,k 9 )*,即可确定唯一的一个Nar(n). [定理] 0. MIN(n)60,Nar(n)不存在. 2. 对满足条件[*]的一个特定的十元组(k 0 ,k 1 ,...,k 9 )*,确定唯一的一个Nar(n). 3. 不定方程k 0 + k 1 +...+ k 9 = n 非负整数解十元组Sj的个数为C{10+n-1,10-1}=C{9+n,9}= (9+n)!/[(9!)(n!)]组. [算法描述] Step1.求解不定方程k 0 + k 1 +...+ k 9 = n 所有的非负整数解S集. Step2.对每个解Sj计算 k 0 *0^n + k 1 *1^n + ...+ k 9 * 9^n =T(n)

水仙花数和完全数

E-mail文化传播网https://www.doczj.com/doc/f315377604.html,

水仙花数

水仙花数外文名narcissistic number。 指的是:在自然数中,如果一个三位数等于其自身各个数字的立方和,那么这个三位数就称为“水仙花数”。 后来,水仙花数又发展称为阿姆斯特朗数,是指一个 n 位数( n≥3 ),它的每 个位上的数字的 n 次幂之和等于它本身。所以就有四位水仙花数、五位水仙花数、六位水仙花数。。。。。。等等。实际上这只是自幂数的一种数。严格来说三位数的3次幂数才是水仙花数。 (例如:13+ 53+ 33 = 153)

在数论中,水仙花数,也被称为 超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong nmber),用来 描述一个N位非负整数,其各个 位数字的N次方和等于该数本身。若将条件放宽,一个N位数,其 各个数之M次方和等于该数,(M 和N不一定相等)这样的数称为 完全数字不变量(perfect digital invariant), 水仙花数一定是完全数字不变量,但完全数字不变量不一定是水仙花数。

阿姆斯特朗数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。 其他位数的自幂数名字 一位自幂数:独身数 两位自幂数:没有 三位自幂数:水仙花数 四位自幂数:四叶玫瑰数 五位自幂数:五角星数 六位自幂数:六合数 七位自幂数:北斗七星数 八位自幂数:八仙数 九位自幂数:九九重阳数 十位自幂数:十全十美数 常见的阿姆斯特朗数。 三位的水仙花数共有4个:153,370,371,407; 四位的水仙花数共有3个:1634,8208,9474; 五位的水仙花数共有3个:54748,92727,93084; 六位的水仙花数只有1个:548834; 七位的水仙花数共有4个:1741725,4210818,9800817,9926315;八位的水仙花数共有3个:24678050,24678051

数学实验水仙花数

Matlab 基础知识 1.目的: - 熟悉MATLAB 的具体操作与操作键。 - 掌握MATLAB 中的常用函数与变量、表达式的定义方法。 - 熟悉MATLAB 常用的工作方式M 文件的编程工作方式 - 掌握MATLAB 语言中的程序结构。 2.任务 (1) 建立一个M 文件,求所有的水仙花数。所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如153是一个水仙花数,因为153=13+53+33 。 (2) 用subplot 分别在不同的坐标系下画出下列四条曲线,为每幅图形加上标题: 概率曲线2 x y e -= 四叶玫瑰曲线sin 2ρθ = 叶形线3233131t x t t y t ?=??+??=?+? 正弦曲线sin y x = (1)运用subplot 函数可以将多个图画到一个平面上,subplot (m,n,p ),其中,m 表示是图排成m 行,n 表示图排成n 列,也就是整个figure 中有n 个图是排成一行的,一共m 行。 function sifutu x=-5:0.01:5; y1=exp(-(x.^2)); j=0:0.01:2*3.14;%概率曲线 p=sin(2*j);%四叶玫瑰线 t=0:0.01:100; x2=3*t./(1+t.^3) y2=3*t.^2./(1+t.^3)%叶形线 a=-2*3.14:0.01:2*3.14; y3=sin(a);%正弦曲线 subplot(2, 2 ,1); plot(x,y1); subplot(2, 2 ,2) polar(j,p); subplot(2, 2 ,3)

水仙花数

1.“水仙花数”是指这样的数,其各位数字的立方和等于该数本身.编写程序求100至999的范围内有多少个水仙花数 #include main() { int dig,k,m,s,count; count=0; for(k=100;k<=999;k++) { dig=0; s=0; dig=k/100; s=s+dig*dig*dig; m=k%100; while(m!=0) { dig=m%10; s=s+dig*dig*dig; dig=m/10; s=s+dig*dig*dig; m=0;

} if(s==k) { count++; } } printf("%d\n",count); } 2.(x,y,z)满足方程:x^2+y^2+z^2=55^2(注:要求x>y>z);则(x,y,z)称为方程的一个解.试求方程的整数解(包括负整数解)的个数. #include main() { int x,y,z,s,n=0; for(x=-55;x<=55;x++) for(y=-55;y

for(z=-55;z main() { int dig,k,m,s,count; count=0; for(k=100;k<=400;k++) { dig=0; s=0; dig=k/100;

关于找出N位数的水仙花数的程序

#include #include //此程序可以找出任意输入的N位数中所包含的全部水仙花数 int xz(int b){int i=2,di=10; while(i1){jieguo=jieguo*m;mi=mi-1;} return jieguo;}//此函数用于求一个数的mi次方其中m为被操作数 int kf(int k,int z){return k/z;}//利用取整求出一个数的最高次幂对应的值 int main(){int ji=0; int n;//确定输入的n的值 int shu;//此数用于存放要寻找最高次幂的值的数 int di;//此数用于确定变化的用于取整的底 int wei;//此数用于存放所求数的某一位的值 int zuixiao;//此数是确定确定次幂的数的最小值 int zuida;//此数是确定确定次幂的数的最大值 int cifanghe=0;//此数用于存放次方的和 cout<<"请输入将要寻找水仙花数的次幂数n的值n="; cin>>n; shu=xz(n); di=xz(n); zuixiao=xz(n); zuida=10*xz(n)-1; while(shu>=zuixiao&&shu<=zuida) {int quedingshu;//此数用于存放某一确定的数用于操作 int dibian;//此数用于替代对于某一具体的数的底 int cifanghe1; cifanghe1=cifanghe; dibian=di; quedingshu=shu; while(quedingshu>0){ wei=kf(quedingshu,dibian); cifanghe1=cifanghe1+cifang(wei,n); quedingshu=quedingshu-wei*dibian; dibian=dibian/10;} if(cifanghe1==shu){ji++;cout<

用Matlab求水仙花数,完美数,回文数和亲合数

题目:对深圳市人口及医疗的预测 编号: 10055 队长李荣 姓名: 李荣(09041117) 王遂(09041124) 李春晓(09055025)

1.水仙花数: (1)题目 若一个三位数自然数的各位数的各位数字的立方和等于该数本身,则称该数为水仙花数,例如,153=1^3+5^3+3^3,所以153为水仙花数,编程计算所有水仙花数. (2)分析问题: 本题特点在于一个数的各个位数立方和与其本身的关系很明确且很简单,可以用if语句或find语句来完成.如果用if语句,则又有两种选择:1.命一个三位数,再表示其各个位数的数字;2.命各个位数的数字,再表示该三位数.如果用find语句,其思路与if语句类似. (3)问题求解: 方法一: for x=100:1:999 a=fix(x/100); b=fix(x/10-10*a); c=x-100*a-10*b; if x==a^3+b^3+c^3 x end end 方法二: for x=1:1:9 for y=0:1:9 for z=0:1:9 if x^3+y^3+z^3==100*x+10*y+z m=100*x+10*y+z end end end end 方法三: shui=100:999; i=floor(shui/100); j=floor(mod(shui,100)/10); k=floor(mod(shui,10)); p=i.^3+j.^3+k.^3;

shui(find(p==shui)) (4)结论及分析: 通过实验,结果正确,证明分析无误. (5)结果: 153 370 371 407 2.回文数 (1)题目: 对于一个自然数,若将各位数字倒序排出,加到原数字上,反复多次,若能得到一个从左到右读和从有到左读完全一样的数,则称该自然数能产生回文数.通过编程计算,你能找出多少个能产生回文数的数,又能找到多少不能产生回文数的数,二者的最小数是多少? (2)分析问题: 本题关键在于如何将一个数的各个数位的数字倒序排出,并加到原数上.又

C语言程序设计100例之(4):水仙花数

C语言程序设计100例之(4):水仙花数 例4 水仙花数 题目描述 一个三位整数(100~999),若各位数的立方和等于该数自身,则称其为“水仙花数”(如:153=13+53+33),找出所有的这种数。 输入格式 没有输入 输出格式 若干行,每行1个数字。 输入样例 无 输出样例 153 * * * ... * * * (输出被和谐了) (1)编程思路1。 对三位数n(n为100~999之间的整数)进行穷举。对每个枚举的n,分解出其百位a (a=n/100)、十位b(b=n/10%10)和个位c(c=n%10),若满足a*a*a+b*b*b+c*c*c== n,则n是水仙花数。 (2)源程序1。 #include int main() { int n, a, b, c; //n、a、b和c分别为三位数自身及其百位、十位和个位 for(n=100 ;n<=999;n++) { a=n/100; b=n/10%10; c=n%10; if(a*a*a+b*b*b+c*c*c== n) printf("%d\n",n); }

return 0; } (3)编程思路2。 用一个三重循环对一个3位数的百位a(a的范围为1~9)、十位b(b的范围为0~9)和个位c(c的范围为0~9)进行穷举,在循环体中,计算出3位数n(n=100*a+10*b+c),然后进行判断,若满足a*a*a+b*b*b+c*c*c== n,则n是水仙花数。 (4)源程序2。 #include using namespace std; int main() { int n, a, b, c; //n、a、b和c分别为三位数自身及其百位、十位和个位 for(a=1 ;a<=9;a++) for (b=0; b<=9;b++) for(c=0;c<=9;c++) { n=100*a+10*b+c; if(a*a*a+b*b*b+c*c*c== n) printf("%d\n",n); } return 0; } 习题4 4-1 子数整数 本题选自洛谷题库(https://https://www.doczj.com/doc/f315377604.html,/problem/P1151) 题目描述 对于一个五位数a1a2a3a4a5,可将其拆分为三个子数: sub1=a1a2a3 sub2=a2a3a4 sub3=a3a4a5 例如,五位数20207可以拆分成 sub1=202 sub2=020(=20)

JAVA课后习题答案

前言 学习网址https://www.doczj.com/doc/f315377604.html, 第一章Java语言基础 1.指出Java语言的主要特点和ava程序的执行过程。 答:强类型。 编译和解释。 自动无用内存回收功能。 面向对象。 与平台无关。 安全性。 分布式计算。 多线程。 2.说出开发与运行Java程序的主要步骤。 答:安装SUN的JDK,配置class path 编写源文件。 编译。 运行。 3.如何区分应用程序和小应用程序。 答:应用程序必须在一类中定义一个main()方法,该方法代表应用程序的入口。 小应用程序不必定义main()方法,但是必须继承applet类。 4.说出Java源文件的命名规则。 答:和类命名规则一样,首字母大写。 5.选择一种上机环境,参照实例,编写一个输出“hello world!”字样的Java程序。 答:选择SUN的IDE,用UltraEdit-32编写如下: //HelloWorld.java /**

*这是第一个程序 *@author 饶林 *@see https://www.doczj.com/doc/f315377604.html, */ class HelloWorld{ public static void main(String[] args) { System.out.println("Hello World!"); } } 6.Java用什么字符集?共有多少个不同的字符? 答:Java语言使用Unicode字符集,共有65535个字符。 7.Java语言标识符的命名规则是什么? 答:由字母(包括英文字母、下划线、美元字符、文字字符)和数字字符组成。 限定标识符的第一个字符不能是数字。 8.Java有哪些基本的数据类型,它们的常量又是如何书写的? 答:基本的数据类型也称为原始数据类型,是系统预先规定的一些常用类型。它们是:整数类型、浮点数(实数)类型、字符(文字)类型、逻辑类型(布尔型)。 9.指出下列内容那些事Java语言的整形常量,哪些是浮点数类型常量,那些两者都 不是? 1)E-4 2)A423 3)-1E-31 4)0xABCL 5).32E31 6)087 7)0x L 8)003 9)0x12.5 10)077 11)11E 12)056L 13)0. 14).0 答:整形常量:4,5,6,8,10,12 浮点型:1,3,9,13,14 两者都不是:2,7,11 第二章运算和语句 1.Java字符能参加算术运算吗? 答:能,例如char类型a自加后变b

C语言实验报告(函数应用)

C语言程序设计II实验报告题目:实验五函数应用 院系名称:计算机学院 专业名称:计算机科学与技术 班级: 学号: 学生姓名: 指导教师: 实验日期:2017年4月1日 报告提交截止日期:2017年4月11日

一、 实验目的 1、 掌握C 语言函数的定义方法、函数的声明及函数的调用方法及调用过程; 2、 掌握主调函数和被调函数之间的参数传递方式; 二、 实验内容与要求: 1、 求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用 另一个函数根据求出的最大公约数求最小公倍数。(提示:设两个整数是a,b ,最大公约数是p,最小公倍数是q ,那么ab=pq ) 2、 用牛顿迭代法求方程f(x)=ax 3+bx 2+cx+d=0的根。系数a 、b 、c 、d 由主 函数输入。求根过程写成函数。(提示:牛顿迭代法是先给定方程f(x)=0的一个较好的初始近似根x 0,然后重复使用迭代公式: 求x 的近似解,直至相邻两次的近似解相差很小为止,如差值的绝对值小于1e-07。x 0可以从键盘输入或直接设定。) 3、 定义一个函数,功能是计算n 个学生的成绩中高于平均成绩的人数,并 作为函数返回值。用主函数来调用它。统计30个学生成绩中高于平均成绩的有多少人。 4、 ∑=+++==n i n p p p i p n s 1 )()2()1()()( ,!)(i i p = 5、 编写和调用函数,给定圆筒的内径、外径和高,计算该圆筒的体积;给

定圆锥的高、底面半径,计算该圆锥的体积和表面积。 6、编写和调用函数,求出10000以内的所有素数、绝对素数、水仙花数、 完全数(或称完数)、互满数。 提示:一个素数经过任意次调换位,仍然为素数,则称其为绝对素数, 例如13和31就是一个绝对素数。水仙花数是指一个三位整数,其各位 数字立方之和等于该数。例如,153就是一个水仙花数:153=1*1*1+ 5*5*5+3*3*3。完全数是指一个数正好是它的所有约数(本身除外)之和。 例如,6就是一个完全数,因为6的因子有1、2、3,并且6=1+2+3。 如果有两个数,每一个数的所有约数(除它本身以外)之和正好等于对 方,则称这两个数为互满数。 三、实验结果 1 题目内容与要求:求两个整数的最大公约数和最小公倍数。用一个函数求最大 公约数,用另一个函数根据求出的最大公约数求最小公倍数。(提示:设两个整数是a,b,最大公约数是p,最小公倍数是q,那么ab=pq) 算法简要描述(文本):通过循环找出最大公约数,根据公式求最小公倍数。 源代码标识符说明(文本):a,b存储数字i,j找最小公倍数和最大公因数。 源代码(粘贴程序,注意缩进,不得使用截图): #include"stdio.h" int f(int a,int b) {int i,j; if(a>b) {a=a+b;b=a-b;a=a-b; } for(i=a;i>=1;i--) if(a%i==0&&b%i==0) return i; }

自考教材《java语言程序设计(一)》第二章习题解答

第二章习题解答 2.1 Java的字符能参加算术运算吗? 可以。(1)字符与整型数据运算,结果为整型数据,只能附给整型变量,如果附给字符型变量会损失精度,需要强制类型装换; (2)字符与字符运算,结果为字符型数据,可以直接附给字符型或整型变量。 2.2 占字节多的变量能直接赋值给占字节少的变量么? 答:不能直接赋值,需要强制类型转换。 2.3 试用Java语言表达式描述以下数学计算式或逻辑条件: 1) 3 )3 4(r V? =π 解:V = (4.0/3)*Math.PI*Math.pow(r,3); 2) ) 1 1( 1 2 1 R R R+ = 解:R = 1.0 / (1.0/R1+1.0/R2); 3) 6 3 5+ + =x x y 解:y = Math.pow(x,5) + Math.pow(x,3) + 6; 4) 2 2 1 R M M F? = 解:F = 1.0 * M1 * M2 / (R * R); 5) ()()|2/ cos | / sin x ax x? +π 解:Math.sin(x) / a * x + Math.abs( Math.cos(π * x / 2) ); 6)0 < a <10 解:a > 0 && a < 10 7) 条件 x=1 与 y=2 有且只有一个成立. 解:( x == 1 && y != 2) || (x != 1 && y == 2) 2.4 设在求以下表达式之前,整型变量a的值是4,试指出在求了以下表达式之后,变量a、b和c的值。 1) ;+ + * =a a b 解:a=5 ; b=16; 2) ;a a c+ + + = ; 解:a=5 ; c=10 2.5编写一个程序,示意前缀++与后缀++的区别,前缀--与后缀--的区别。 分析:其实只是在程序中简单地使用这两类自增、自减运算符就可以了,打印出运算前后的值就可以了,同学们可以自行写出,这里只给出参考程序: public class Xt25 { public static void main(String[] args) { int i=7,j=5,k=10,n=8,x,y; System.out.print("变量i的值为"+i); x=i++; System.out.println(",执行赋值运算x=i++后,x的值为"+x+",i的值为"+i);//提示注意print和println的差别,并注意本题整体输入效果!!! System.out.print("变量j的值为"+j);

自考JAVA语言程序设计(一)课后习题答案和源代码(第二章)

第二章 2.1 Java的字符能参加算术运算吗? 可以。(1)字符与整型数据运算,结果为整型数据,只能附给整型变量,如果附给字符型变量会损失精度,需要强制类型装换; (2)字符与字符运算,结果为字符型数据,可以直接附给字符型或整型变量。 2.2 占字节多的变量能直接赋值给占字节少的变量么? 答:不能直接赋值,需要强制类型转换。 2.3 试用Java语言表达式描述以下数学计算式或逻辑条件: 1) 3 )3 4(r V? =π 解:V = (4.0/3)*Math.PI*Math.pow(r,3); 2) ) 1 1( 1 2 1 R R R+ = 解:R = 1.0 / (1.0/R1+1.0/R2); 3) 6 3 5+ + =x x y 解:y = Math.pow(x,5) + Math.pow(x,3) + 6; 4) 2 2 1 R M M F? = 解:F = 1.0 * M1 * M2 / (R * R); 5) ()()|2/ cos | / sin x ax x? +π 解:Math.sin(x) / a * x + Math.abs( Math.cos(π * x / 2) ); 6)0 < a <10 解:a > 0 && a < 10 7) 条件 x=1 与 y=2 有且只有一个成立. 解:( x == 1 && y != 2) || (x != 1 && y == 2) 2.4 设在求以下表达式之前,整型变量a的值是4,试指出在求了以下表达式之后,变量a、b和c的值。 1) ;+ + * =a a b 解:a=5 ; b=16; 2) ;a a c+ + + = ; 解:a=5 ; c=10 2.6 若一个数恰好等于它的因子之和,则这个数称为“完全数”。编写程序求1000之内的所有完全数。 分析:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数。

判断水仙花数

判断水仙花数 水仙花数是指一个数各位数的立方和与该数本身的数值相等的数,如371=3*3*3+7*7*7+1*1*1,则371 是一个水仙花数。 (1)从控制台输入一个数,判断该数数是不是水仙花数; (2)编程找出1000 以内所有水仙花数。(选做) 程序源代码(学生填写): (1)、import java.util.Scanner; public class Flower1 { public static void main(String[] args) { int x,a,b,c; System.out.println("请输入一个数:"); Scanner scanner = new Scanner(System.in); x=scanner.nextInt(); a=x/100; b=x/10-10*a; c=x%10; if(a*a*a+b*b*b+c*c*c==x) System.out.println(" 是一个水仙花数!"); else System.out.println(" 不是水仙花数!"); } } (2)、import java.util.Scanner; public class Flower2 { public static void main(String[] args) { int i,a,b,c; System.out.println("1000以内的水仙花数为:"); for(i=1;i<1000;i++) { a=i/100; b=i/10-10*a; c=i%10; if(i==a*a*a+b*b*b+c*c*c) System.out.println(" "+i); } }

水仙花数

水仙花数 水仙花 什么是水仙花数 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:水仙花数是指一个 n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153) 常见水仙花数 三位的水仙花数共有4个:153,370,371,407; 四位的水仙花数共有3个:1634,8208,9474; 五位的水仙花数共有3个:54748,92727,93084; 六位的水仙花数只有1个:548834; 七位的水仙花数共有4个:1741725,4210818,9800817,9926315; 八位的水仙花数共有3个:24678050,24678051,88593477 …… …… 使用高精度计算,可以得到超过INT类型上限的水仙花数: 5: 93084 5: 92727 5: 54748 6: 548834 7: 9800817 7: 4210818 7: 1741725 7: 9926315 8: 24678050

8: 24678051 8: 88593477 9: 146511208 9: 912985153 9: 472335975 9: 534494836 10: 4679307774 11: 32164049650 11: 40028394225 11: 42678290603 11: 49388550606 11: 32164049651 11: 94204591914 11: 44708635679 11: 82693916578 14: 28116440335967 16: 4338281769391370 16: 4338281769391371 17: 35875699062250035 17: 21897142587612075 19: 3289582984443187032 19: 4929273885928088826 19: 4498128791164624869 20: 63105425988599693916 21: 449177399146038697307 21: 128468643043731391252 23: 27907865009977052567814 23: 35452590104031691935943 23: 27879694893054074471405 23: 21887696841122916288858 24: 174088005938065293023722 24: 188451485447897896036875 (为环保起见,24位以上的水仙花数略) 理论上,最大的水仙花数不超过34位。 求取方法(非高精度) 以下为在各种编程语言中实现求取水仙花数的方法(非高精度)。

数学文化之神奇的数

数学文化之神奇的数 一、对自然数的理性认识 [百度百科]毕达哥拉斯:古希腊著名的哲学家和数学家,最早悟出 万事万物背后都有数的法则在起作用,无论是解说外在物质世界, 还是描写内在精神世界,都不能没有数学! 1、毕达哥拉斯学派认为: “1”是万物之母宇宙的创造者,也是智慧; “2”是第一个阴性的数(偶数),代表变化多端的见解; “3”是第一个阳性的数,它是1和2构成的,代表单一和多变所构成的调和; “4”是一个完全平方,代表公正; “5”是婚姻,它由第一个阳性和第一个阴性的数构成,因此象征结合和结婚; “6”是神的生命,是灵魂;“7”是机会;“8”是和谐,也是爱情和友谊;“9”是理性和强大;“10”包容了一切数目,是完满和美好。 “13”在西方国家表示不幸,《最后的晚餐》,传说耶稣受害前和弟子们共进了一次晚餐。参加晚餐的第13个人是耶稣的弟子犹大。就是这个犹大为了30块银元,把耶稣出卖给犹太教当局,致使耶稣受尽折磨。参加最后晚餐的是13个人,晚餐的日期恰逢13日,“13”给耶稣带来苦难和不幸。从此,“13”被认为是不幸的象征。“13”是背叛和出卖的同义词。(补充:传说耶稣是被钉死在13号十字架上的) (犹大向官府告密,耶稣在即将被捕前,与十二门徒共进晚餐,席间耶稣镇定地说出了有人出卖他的消息,达·芬奇此作就是耶稣说出这一句话时的情景。画家通过各种手法,生动地刻画了耶稣的沉静、安详,以及十二门徒各自不同的姿态、表情。此作传达出丰富的心理内容。《最后的晚餐(The Last Supper)》是意大利艺术家列奥纳多·达·芬奇所创作,是所有以这个题材创作的作品中最著名的一幅。画面中的人物,以惊恐、愤怒、怀疑、剖白等神态,以及手势、眼神和行为,都刻划得精细入微,惟妙惟肖。现藏米兰圣玛利亚德尔格契修道院。) 2、我国古代对数的认识: “道生一,一生二,二生三,三生万物” 一:这是老子用以代替道这一概念的数字表示,即道是绝对无偶的。 二:指阴气、阳气。“道”的本身包含着对立的两方面。阴阳二气所含育的统一体即是“道”。因此,对立着的双方都包含在“一”中。

水仙花数(matlab编程求解)

水仙花数是指一个 n 位数( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153) 三位的水仙花数共有4个:153,370,371,407; 四位的水仙花数共有3个:1634,8208,9474; 五位的水仙花数共有3个:54748,92727,93084; 六位的水仙花数只有1个:548834; 七位的水仙花数共有4个:1741725,4210818,9800817,9926315; 八位的水仙花数共有3个:24678050,24678051,88593477 下面我们运用Matlab编写程序求解水仙花数。 Matlab程序如下: function shuixian(n) %n为用户输入的一个整数 W=zeros(1,n); ss=0; for m=10^(n-1):10^n-1 for i=1:n W(i)=fix(rem(m,10^(n+1-i))/10^(n-i)); end W=W.^n; for j=1:n ss=ss+W(j); end if m==ss disp(m); end ss=0; W=zeros(1,n); end 运行结果示例: >> shuixian1(3) 153 370 371 407 >> shuixian1(4) 1634 8208 9474 >> shuixian1(5) 54748 92727 93084

>> shuixian1(6) 548834 >> shuixian1(7) 1741725 4210818 9800817 9926315 解析:上述程序,在理论上可以求解一切水仙花数,但限于计算机的精度,当n 较大时,程序运行时间较长。整个程序简洁实用。

Java简单题

~~~b 0.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6 = 1 + 2 + 3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面的格式输出其因子: 6 -〉1,2,3 ~ 参考程序如下: public class 完数{ public static void main(String[] args) { int i,j,sum=0,k=0,t; int[] a=new int[50]; for(i=1;i<=1000;i++) { sum=0; for(j=1;j"); for(k=0;k

打印出1000以内的所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153 = 13 + 53 + 33。 ~ 参考程序如下: public class 水仙花数{ public static void main(String[] args) { int i=0,j=0,k=0,n=1; for(int m=100;m<1000;m++){ i=m%10; j=m/10%10; k=m/100%10; if(Math.pow(i, 3)+Math.pow(j, 3)+Math.pow(k,3)==m){ System.out.print(m+"\t"); if(n%2==0){ System.out.println(); } n++; } } } } 评分标准: 2、写出能完成题目要求功能的、可正常运行的java程序,给满分,否则0分 ~~~b 求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。例如:2+22+222+…+22222(此时n=5),n由键盘输入。 ~ 参考程序如下: import java.util.Scanner; public class N位相同数字和{ public static void main(String[] args) { int i=0,n=0,sum=0,result=0; Scanner sc=new Scanner(System.in); System.out.println("input a number,from 1 to 9:"); i=sc.nextInt(); System.out.println("input N number"); n=sc.nextInt(); sum=i; for(int j=1;j

相关主题
文本预览
相关文档 最新文档