x[32]也是存放结果的。
模重复平方法求的是a^m%n
当m=13,即二进制的 1101 = 1 2^3 + 1 2^2 + 0 2^1 + 1 2^0时,最终结果
ans =a^m % n
= a^(1 2^3 + 1 2^2 + 0 2^1 + 1 2^0) %n
= [a^(1 2^3)] [a^(1 2^2)] [(a ^ (0 2^1)] [a ^ (1 2^0)] % n
也就是说,从低到高,在第 i 位的时候,将a^(bin[i] 2^i) %n 乘到结果中即可。这里可以稍微变换一下:仅当bin[i] == 1的时候,将a^(2^i) % n乘进去即可。所以这里可以用一个辅助的变量 b 来保存 a^(2^i) % n,在每次迭代的过程中 b = b^2 % n 。
你自己修改修改:
#include <stdioh>
#include <ctypeh>
#include <timeh>
#include <stdlibh>
#include <windowsh>
#define IDNO_LENGTH 6
#define CALC_KIND 4
#define CALC_NUM 10
bool checkNo(char idNo[]);
char getSignal();
int getResult(int,int,char);
void takeTest();
//main函数
void main()
{
printf("Please input your four digit ID no(begin with two letters):");
char idNo[IDNO_LENGTH];
do
{
scanf("%s",&idNo);
fflush(stdin);
} while(checkNo(idNo)==false);
printf("1Start a test\t2Exitb\n");
int choose;
do
{
printf("选择:");
scanf("%d",&choose);
fflush(stdin);
} while(choose!=1 && choose!=2);
if(choose==1)
takeTest();
else
exit(0);
}
//获取随机运算符
char getSignal()
{
char signal[CALC_KIND]={'+','-','','/'};
srand((unsigned)time(NULL));
return signal[rand()%4];
}
//获取随机数
int random(double start, double end)
{
return (int)(start+(end-start)rand()/(RAND_MAX+ 10));
}
//运算
int getResult(int num1,int num2,char signal)
{
int res;
switch(signal)
{
case '+':
res=num1+num2;break;
case '-':
res=num1-num2;break;
case '':
res=num1num2;break;
case '/':
res=num1/num2;break;
default:
res=0;
printf("运算符不符合规则\n");
}
return res;
}
//列出10道题
void takeTest()
{
clock_t startTime;
startTime=clock();
int index;
int giveRes;
int num1;
int num2;
char signal;
for(index=0;index<CALC_NUM;index++)
{
srand((unsigned)time(NULL));
signal=getSignal();
num1=random(0,100);
num2=random(1,100);
printf("%d%c%d=",num1,signal,num2);
scanf("%d",&giveRes);
fflush(stdin);
if(getResult(num1,num2,signal)==giveRes)
{
printf("correct\n");
}
else
{
printf("wrong\n");
}
}
printf("解10道题用了%lf秒\n",(double)(clock()- startTime)/CLOCKS_PER_SEC);
}
//检测idNo是否合规则,合规则返回true
bool checkNo(char idNo[])
{
int index;
bool flag;
flag=true;
for(index=0;index<IDNO_LENGTH;index++)
{
if(index<2)
{
if(!isalpha(idNo[index]))
{
flag=false;
printf("ID no 不符合规则,重新输入:");
break;
}
}
else
{
if(!isdigit(idNo[index]))
{
flag=false;
printf("ID no 不符合规则,重新输入:");
break;
}
}
}
return flag;
}
我理解的简单的数学表达式:纯数字+运算符+纯数字+(回车)
而且这里的运算符指 +,-,,/ 四种之一,纯数字是指整数
如下:
#include <stdioh>
#define NUMSIZE 10 // *** 作数长度
int ch_to_num(char a[]); //多位数字符到数值的转换
void main()
{
char var1[NUMSIZE+1]; //存放第一个 *** 作数字符串,最后一位存放结束符'\0'
char var2[NUMSIZE+1]; //存放第二个 *** 作数字符串,最后一位存放结束符'\0'
char var_op; //存放 *** 作数字符
bool flag1 = false; //用来标记是否已经输入第一个 *** 作数字符串
bool flag2 = false; //用来标记是否已经输入第二个 *** 作数字符串
bool flag_op = false; //用来标记是否已经输入 *** 作符
int num1; //存放第一个 *** 作数值
int num2; //存放第二个 *** 作数值
double result0; //存放运算结果
char current_char;
int i = 0;
printf("请输入简单表达式!\n");
scanf("%c", ¤t_char);
while (current_char >= '0' && current_char <= '9')
{//输入第一个变量
var1[i++] = current_char;
scanf("%c", ¤t_char);
}
if ( i > 0 )
{//第一个 *** 作数合格
flag1 = true; //保存好第一个 *** 作数,改变标记
var1[i] = '\0'; //加入结束符
}
else
{
printf("输入格式有错!");
return;
}
if (current_char =='+'||current_char =='-'||current_char ==''||current_char =='/')
{// *** 作符为加减乘除,合格
var_op = current_char; //保存 *** 作符
flag_op = true; //改变标记符
}
else
{
printf("输入格式有错!");
return;
}
scanf("%c", ¤t_char);
i = 0;
while (current_char >= '0' && current_char <= '9')
{//输入第二个变量
var2[i++] = current_char;
scanf("%c", ¤t_char);
}
if ( i > 0 )
{//第二个 *** 作数合格
flag2 = true; //保存好第二个 *** 作数,改变标记
var2[i] = '\0'; //加入结束符
}
else
{
printf("输入格式有错!");
return;
}
//计算:
num1 = ch_to_num(var1);
num2 = ch_to_num(var2);
switch(var_op)
{
case '+' :
result0 = num1 + num2;
printf("\n%d+%d=%f\n",num1,num2,result0);
break;
case '-' :
result0 = num1 - num2;
printf("\n%d-%d=%f\n",num1,num2,result0);
break;
case '' :
result0 = num1 num2;
printf("\n%d%d=%f\n",num1,num2,result0);
break;
case '/' :
result0 = (num1 + 00) / num2;
printf("\n%d/%d=%f\n",num1,num2,result0);
break;
default:
break;
}
}
int ch_to_num(char input[])
{
int sum = 0;
int i = 0;
char ch;
ch = input[i];
while ( ch != '\0')
{
sum = sum 10 +ch - '0';
i++;
ch = input[i];
}
return sum;
}
一般来说学习数学建模,常用的软件有四种,分别是:matlab、lingo、Mathematica和SAS下面简单介绍一下这四种。
1MATLAB的概况
MATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处
理,可视化建模仿真和实时控制等功能。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等
语言完相同的事情简捷得多
当前流行的MATLAB 53/Simulink 30包括拥有数百个内部函数的主包和三十几种工具包(Toolbox)工具包又可以分为功能性工具
包和学科工具包功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能学科工具包是专业性比较强
的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类
开放性使MATLAB广受用户欢迎除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改
或加入自己编写程序构造新的专用工具包
2Mathematica的概况
Wolfram Research 是高科技计算机运算( Technical computing )的先趋,由复杂理论的发明者 Stephen Wolfram 成立于
1987年,在1988年推出高科技计算机运算软件Mathematica,是一个足以媲美诺贝尔奖的天才产品。Mathematica 是一套整合数字以
及符号运算的数学工具软件,提供了全球超过百万的研究人员,工程师,物理学家,分析师以及其它技术专业人员容易使用的顶级
科学运算环境。目前已在学术界、电机、机械、化学、土木、信息工程、财务金融、医学、物理、统计、教育出版、OEM 等领域广
泛使用。
Mathematica 的特色
·具有高阶的演算方法和丰富的数学函数库和庞大的数学知识库,让 Mathematica 5 在线性代数方面的数值运算,例如特征向量、 反矩阵等,皆比Matlab R13做得更快更好,提供业界最精确的数值运算结果。
·Mathematica不但可以做数值计算,还提供最优秀的可设计的符号运算。
·丰富的数学函数库,可以快速的解答微积分、线性代数、微分方程、复变函数、数值分析、机率统计等等问题。
·Mathematica可以绘制各专业领域专业函数图形,提供丰富的图形表示方法,结果呈现可视化。
·Mathematica可编排专业的科学论文期刊,让运算与排版在同一环境下完成,提供高品质可编辑的排版公式与表格,屏幕与打印的 自动最佳化排版,组织由初始概念到最后报告的计划,并且对 txt、html、pdf 等格式的输出提供了最好的兼容性。
·可与 C、C++ 、Fortran、Perl、Visual Basic、以及 Java 结合,提供强大高级语言接口功能,使得程序开发更方便。
·Mathematica本身就是一个方便学习的程序语言。 Mathematica提供互动且丰富的帮助功能,让使用者现学现卖。强大的功能,简 单的 *** 作,非常容易学习特点,可以最有效的缩短研发时间。
3lingo的概况
LINGO则用于求解非线性规划(NLP—NON—LINEAR PROGRAMMING)和二次规则(QP—QUARATIC PROGRAMING)其中
LINGO 60学生版最多可版最多达300个变量和150个约束的规则问题,其标准版的求解能力亦再10^4量级以上。虽然LINDO和
LINGO不能直接求解目标规划问题,但用序贯式算法可分解成一个个LINDO和LINGO能解决的规划问题。
模型建立语言和求解引擎的整合
LINGO是使建立和求解线性、非线性和整数最佳化模型更快更简单更有效率的综合工具。LINGO提供强大的语言和快速的求解引擎来阐述和求解最佳化模型。
■ 简单的模型表示
LINGO可以将线性、非线性和整数问题迅速得予以公式表示,并且容易阅读、了解和修改。
■ 方便的数据输入和输出选择
LINGO建立的模型可以直接从数据库或工作表获取资料。同样地, LINGO可以将求解结果直接输出到数据库或工作表。
■ 强大的求解引擎
LINGO内建的求解引擎有线性、非线性(convex and nonconvex)、二次、二次限制和整数最佳化。
■ Model Interactively or Create Turn-key Applications
LINGO提供完全互动的环境供您建立、求解和分析模型。LINGO也提供DLL和OLE界面可供使用者由撰写的程序中呼叫。
■ 广泛的文件和HELP功能
LINGO提供的所有工具和文件可使你迅速入门和上手。LINGO使用者手册有详细的功能定义。
4SAS软件概况
SAS系统全称为Statistics Analysis System,最早由北卡罗来纳大学的两位生物统计学研究生编制,并于1976年成立了SAS软件研究所,正式推出了SAS软件。SAS是用于决策支持的大型集成信息系统,但该软件系统最早的功能限于统计分析,至今,统计分析功能也仍是它的重要组成部分和核心功能。SAS现在的版本为90版,大小约为1G。经过多年的发展,SAS已被全世界120多个国家和地区的近三万家机构所采用,直接用户则超过三百万人,遍及金融、医药卫生、生产、运输、通讯、政府和教育科研等领域。在英美等国,能熟练使用SAS进行统计分析是许多公司和科研机构选材的条件之一。在数据处理和统计分析领域,SAS系统被誉为国际上的标准软件系统,并在96~97年度被评选为建立数据库的首选产品。堪称统计软件界的巨无霸。在此仅举一例如下:在以苛刻严格著称于世的美国FDA新药审批程序中,新药试验结果的统计分析规定只能用SAS进行,其他软件的计算结果一律无效!哪怕只是简单的均数和标准差也不行!由此可见SAS的权威地位。
SAS系统是一个组合软件系统,它由多个功能模块组合而成,其基本部分是BASE SAS模块。BASE SAS模块是SAS系统的核心,承担着主要的数据管理任务,并管理用户使用环境,进行用户语言的处理,调用其他SAS模块和产品。也就是说,SAS系统的运行,首先必须启动BASE SAS模块,它除了本身所具有数据管理、程序设计及描述统计计算功能以外,还是SAS系统的中央调度室。它除可单独存在外,也可与其他产品或模块共同构成一个完整的系统。各模块的安装及更新都可通过其安装程序非常方便地进行。SAS系统具有灵活的功能扩展接口和强大的功能模块,在BASE SAS的基础上,还可以增加如下不同的模块而增加不同的功能:SAS/STAT(统计分析模块)、SAS/GRAPH(绘图模块)、SAS/QC(质量控制模块)、SAS/ETS(经济计量学和时间序列分析模块)、SAS/OR(运筹学模块)、SAS/IML(交互式矩阵程序设计语言模块)、SAS/FSP(快速数据处理的交互式菜单系统模块)、SAS/AF(交互式全屏幕软件应用系统模块)等等。SAS有一个智能型绘图系统,不仅能绘各种统计图,还能绘出地图。SAS提供多个统计过程,每个过程均含有极丰富的任选项。用户还可以通过对数据集的一连串加工,实现更为复杂的统计分析。此外,SAS还提供了各类概率分析函数、分位数函数、样本统计函数和随机数生成函数,使用户能方便地实现特殊统计要求。
以上就是关于C语言 一个数学程序求解释全部的内容,包括:C语言 一个数学程序求解释、求大神用C语言设计一个程序帮助小学生练习数学。(具体要求见问题补充)、C语言 从键盘输入一个简单的数学表达式,计算并显示该表达式的值 求算法和程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)