|
|
#include <stdio.h>
|
|
|
#include<math.h>
|
|
|
#include<string.h>
|
|
|
#define PI 3.1415926535
|
|
|
#define N 1000
|
|
|
#define M 0.00000001
|
|
|
#define ull unsigned long long
|
|
|
int choose(void);//菜单选项输入函数
|
|
|
void output_hand(void);//菜单内容输入函数
|
|
|
void add(void);//加法函数
|
|
|
void sub(void);//减法函数
|
|
|
void mul(void);//乘法函数
|
|
|
void div(void);//除法函数
|
|
|
void remainde(void);//求模运算函数
|
|
|
void factorial(void);//阶乘函数
|
|
|
void prime(void);//判断素数函数
|
|
|
void volume(void);//求球的体积
|
|
|
void fibonacci(void);//斐波那契数列函数
|
|
|
void power(void);//求次方
|
|
|
void minmul(void);//最小公倍数
|
|
|
void maxdiv(void);//最大公约数
|
|
|
void Swap(void);//交换函数
|
|
|
void Sort(void);//排序函数
|
|
|
double input_decimal(int *flag);//输入双精度小数的函数
|
|
|
long long input_integer(int *flag);//输入整数的函数
|
|
|
int choose(void)
|
|
|
{
|
|
|
int flag=1,ch;//flag标记输入格式是否正确
|
|
|
printf("请输入需要进行操作的编号\n");
|
|
|
ch=input_integer(&flag);
|
|
|
if(flag)
|
|
|
return ch;
|
|
|
else
|
|
|
{
|
|
|
printf("输入有误\n");
|
|
|
return choose();
|
|
|
}
|
|
|
}
|
|
|
void output_hand(void)
|
|
|
{
|
|
|
printf("1----两个数的加法\n");
|
|
|
printf("2----两个数的减法\n");
|
|
|
printf("3----两个数的乘法\n");
|
|
|
printf("4----两个数的除法\n");
|
|
|
printf("5----两个数的求模运算\n");
|
|
|
printf("6----求一个数的阶乘\n");
|
|
|
printf("7----判断一个数是否为素数\n");
|
|
|
printf("8----已知半径求其球的体积\n");
|
|
|
printf("9----求斐波那切数列的某项\n");
|
|
|
printf("10----求一个数的n次方\n");
|
|
|
printf("11----求两个数的最大公约数\n");
|
|
|
printf("12----求两个数的最小公倍数\n");
|
|
|
printf("13----交换两个数\n");
|
|
|
printf("14----对输入的若干个数进行排序\n");
|
|
|
printf("0----结束程序\n");
|
|
|
}
|
|
|
void add(void)
|
|
|
{
|
|
|
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
|
|
|
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
|
|
|
while(1)
|
|
|
{
|
|
|
t=input_integer(&flag);
|
|
|
if((t==1||t==0)&&flag)
|
|
|
break;
|
|
|
else
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
}
|
|
|
printf("请输入两个加数\n");
|
|
|
if(!t)
|
|
|
{
|
|
|
double a,b;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_decimal(&flag1);
|
|
|
b=input_decimal(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%.2lf\n",a+b);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
long long a,b;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%lld\n",a+b);
|
|
|
}
|
|
|
}
|
|
|
void sub(void)
|
|
|
{
|
|
|
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
|
|
|
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
|
|
|
while(1)
|
|
|
{
|
|
|
t=input_integer(&flag);
|
|
|
if((t==1||t==0)&&flag)
|
|
|
break;
|
|
|
else
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
}
|
|
|
printf("请依次输入被减数和减数\n");
|
|
|
if(!t)
|
|
|
{
|
|
|
double a,b;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_decimal(&flag1);
|
|
|
b=input_decimal(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%.2lf\n",a-b);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
long long a,b;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%lld\n",a-b);
|
|
|
}
|
|
|
}
|
|
|
void mul(void)
|
|
|
{
|
|
|
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
|
|
|
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
|
|
|
while(1)
|
|
|
{
|
|
|
t=input_integer(&flag);
|
|
|
if((t==1||t==0)&&flag)
|
|
|
break;
|
|
|
else
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
}
|
|
|
printf("请输入两个乘数\n");
|
|
|
if(!t)
|
|
|
{
|
|
|
double a,b;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_decimal(&flag1);
|
|
|
b=input_decimal(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%.2lf\n",a*b);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
long long a,b;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%lld\n",a*b);
|
|
|
}
|
|
|
}
|
|
|
void div(void)
|
|
|
{
|
|
|
int flag1=1,flag2=1,t,flag=1;//flag1,flag2和flag标记输入格式是否正确
|
|
|
printf("请选择输入格式:1为整数;0为小数(结果保留两位有效小数)\n");
|
|
|
while(1)
|
|
|
{
|
|
|
t=input_integer(&flag);
|
|
|
if((t==1||t==0)&&flag)
|
|
|
break;
|
|
|
else
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
}
|
|
|
printf("请依次输入被除数和除数\n");
|
|
|
if(!t)
|
|
|
{
|
|
|
double a,b=1;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2||fabs(b)<M)//除数不能为0
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_decimal(&flag1);
|
|
|
b=input_decimal(&flag2);
|
|
|
}while(flag1==0||flag2==0||fabs(b)<M);
|
|
|
printf("%.2lf\n",a/b);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
long long a,b=1;
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2||b==0)//除数不能为0
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0||b==0);
|
|
|
printf("%lld\n",a/b);
|
|
|
}
|
|
|
}
|
|
|
void remainde(void)
|
|
|
{
|
|
|
long long a,b;
|
|
|
int flag1=1,flag2=1;//flag1,flag2标记输入格式是否正确
|
|
|
printf("请输入两个正整数\n");
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2||a<1||b<1)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0||a<1||b<1);
|
|
|
printf("%lld\n",a%b);
|
|
|
}
|
|
|
void factorial(void)
|
|
|
{
|
|
|
long long a;
|
|
|
ull s=1;
|
|
|
int flag=1,i;
|
|
|
printf("请输入一个自然数\n");//flag标记输入格式是否正确
|
|
|
do
|
|
|
{
|
|
|
if(flag==0||a<0)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag);
|
|
|
}while(flag==0||a<0);
|
|
|
if(a==0)
|
|
|
printf("1\n");
|
|
|
else
|
|
|
{
|
|
|
for(i=1;i<=a;i++)
|
|
|
s*=i;
|
|
|
printf("%llu\n",s);
|
|
|
}
|
|
|
}
|
|
|
void prime(void)
|
|
|
{
|
|
|
long long a;
|
|
|
double t;
|
|
|
int flag=1,i;
|
|
|
printf("请输入一个正整数\n");//flag标记输入格式是否正确
|
|
|
do
|
|
|
{
|
|
|
if(flag==0||a<1)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag);
|
|
|
}while(flag==0||a<1);
|
|
|
if(a==1)
|
|
|
printf("NO\n");
|
|
|
else if(a==2)
|
|
|
printf("YES\n");
|
|
|
else
|
|
|
{
|
|
|
t=sqrt(a);
|
|
|
for(i=2;i<=t;i++)
|
|
|
if(a%i==0)
|
|
|
{
|
|
|
printf("NO\n");
|
|
|
break;
|
|
|
}
|
|
|
if(i>t)
|
|
|
printf("YES\n");
|
|
|
}
|
|
|
}
|
|
|
void volume(void)
|
|
|
{
|
|
|
double a;
|
|
|
int flag=1;//flag标记输入格式是否正确
|
|
|
printf("请输入一个正数(结果保留两位小数,圆周率取3.1415926535)\n");
|
|
|
do
|
|
|
{
|
|
|
if(flag==0||a<0)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_decimal(&flag);
|
|
|
}while(flag==0||a<0);
|
|
|
printf("%.2lf\n",4*PI*a*a*a/3);
|
|
|
}
|
|
|
void fibonacci(void)
|
|
|
{
|
|
|
long long a,f1=1,f2=1,t;//第一项和第二项为1
|
|
|
int flag=1,i;//flag标记输入格式是否正确
|
|
|
printf("请输入一个正整数\n");
|
|
|
do
|
|
|
{
|
|
|
if(flag==0||a<1)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag);
|
|
|
}while(flag==0||a<1);
|
|
|
if(a==1||a==2)
|
|
|
printf("1\n");
|
|
|
else
|
|
|
{
|
|
|
for(i=3;i<=a;i++)
|
|
|
{
|
|
|
t=f1+f2;
|
|
|
f1=f2;
|
|
|
f2=t;
|
|
|
}
|
|
|
printf("%lld\n",f2);
|
|
|
}
|
|
|
}
|
|
|
void power(void)
|
|
|
{
|
|
|
double a,s=1;
|
|
|
int b,i;
|
|
|
int flag1=1,flag2=1;//flag1,flag2标记输入格式是否正确
|
|
|
printf("请依次输入底数和指数(指数须为自然数,结果保留两位小数)\n");
|
|
|
do
|
|
|
{
|
|
|
if(flag2==0||flag1==0||b<0)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_decimal(&flag2);
|
|
|
b=input_integer(&flag1);
|
|
|
}while(flag2==0||flag1==0||b<0);
|
|
|
for(i=0;i<b;i++)
|
|
|
s*=a;
|
|
|
printf("%.2lf\n",s);
|
|
|
}
|
|
|
void minmul(void)
|
|
|
{
|
|
|
long long a,b,t=1,i,min,max;//t为最大公约数,min存放a,b中的最小值
|
|
|
int flag1=1,flag2=1;//flag1,flag2和标记输入格式是否正确
|
|
|
printf("请输入两个正整数\n");
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2||a<=0||b<=0)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0||a<=0||b<=0);
|
|
|
min=a<b?a:b;
|
|
|
max=a>b?a:b;
|
|
|
while(max%min)
|
|
|
{
|
|
|
t=max%min;
|
|
|
max=min;
|
|
|
min=t;
|
|
|
}
|
|
|
printf("%lld\n",a*b/min);
|
|
|
}
|
|
|
void maxdiv(void)
|
|
|
{
|
|
|
long long a,b,t=1,i,min,max;//t为最大公约数,min存放a,b中的最小值
|
|
|
int flag1=1,flag2=1;//flag1,flag2和标记输入格式是否正确
|
|
|
printf("请输入两个正整数\n");
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2||a<=0||b<=0)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0||a<=0||b<=0);
|
|
|
min=a<b?a:b;
|
|
|
max=a>b?a:b;
|
|
|
while(max%min)
|
|
|
{
|
|
|
t=max%min;
|
|
|
max=min;
|
|
|
min=t;
|
|
|
}
|
|
|
printf("%lld\n",min);
|
|
|
}
|
|
|
void Swap(void)
|
|
|
{
|
|
|
long long a,b;
|
|
|
int flag1=1,flag2=1;//flag1,flag2标记输入格式是否正确
|
|
|
printf("请输入两个整数\n");
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
a=input_integer(&flag1);
|
|
|
b=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0);
|
|
|
printf("%lld %lld\n",b,a);
|
|
|
}
|
|
|
void Sort(void)
|
|
|
{
|
|
|
long long a[N];
|
|
|
int flag1=1,flag2=1,n=1,t=1,flag=1,i,s;//flag1,flag2和flag标记输入格式是否正确,s是输入合格数据的个数,t判定排序方式
|
|
|
printf("请输入需要排序的数的个数(不超过1000的正整数)和需要排序的方式(0代表升序,1代表降序)\n");
|
|
|
do
|
|
|
{
|
|
|
if((flag1+flag2)<2||(t!=0&&t!=1)||n>N||n<=0)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
n=input_integer(&flag1);
|
|
|
t=input_integer(&flag2);
|
|
|
}while(flag1==0||flag2==0||(t!=0&&t!=1)||n>N||n<=0);
|
|
|
do
|
|
|
{
|
|
|
s=0;
|
|
|
for(i=0;i<n;i++)
|
|
|
{
|
|
|
a[i]=input_integer(&flag);
|
|
|
if(flag)
|
|
|
s++;
|
|
|
flag=1;
|
|
|
}
|
|
|
if(s!=n)
|
|
|
printf("输入有误\n请重新输入\n");
|
|
|
}while(s!=n);
|
|
|
while(s--&&flag)
|
|
|
{
|
|
|
flag=0;
|
|
|
for(i=0;i<s;i++)
|
|
|
{
|
|
|
if(a[i]>a[i+1])
|
|
|
{
|
|
|
flag=1;
|
|
|
int temp=a[i];
|
|
|
a[i]=a[i+1];
|
|
|
a[i+1]=temp;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if(t==0)
|
|
|
for(i=0;i<n;i++)
|
|
|
{
|
|
|
if(i==n-1)
|
|
|
printf("%lld\n",a[i]);
|
|
|
else
|
|
|
printf("%lld ",a[i]);
|
|
|
}
|
|
|
else
|
|
|
for(i=n-1;i>=0;i--)
|
|
|
{
|
|
|
if(i)
|
|
|
printf("%lld ",a[i]);
|
|
|
else
|
|
|
printf("%lld\n",a[i]);
|
|
|
}
|
|
|
}
|
|
|
double input_decimal(int *flag)
|
|
|
{
|
|
|
char a[N];
|
|
|
*flag=1;//先默认输入格式合格为1不合格为0
|
|
|
int i=0,symbol=1,point=0;//symbol判定正负号,point判定小数点是否出现过
|
|
|
double s=0,t=0.1;//t为小数点后部分转化,s存放总值
|
|
|
scanf("%s",a);
|
|
|
if((a[0]=='-'&&strlen(a)==1)||(a[0]=='0'&&a[1]=='0'))//防止输入"00" "-"判定输入合格
|
|
|
{
|
|
|
*flag=0;
|
|
|
return 0;
|
|
|
}
|
|
|
else if(a[0]=='-')//检测并处理正负号
|
|
|
{
|
|
|
symbol=-1;
|
|
|
i=1;
|
|
|
}
|
|
|
while(a[i]!='\0')
|
|
|
{
|
|
|
if((a[i]>='0'&&a[i]<='9')&&point==0)//处理整数部分数字字符
|
|
|
s=s*10+(a[i]-'0');
|
|
|
else if((a[i]>='0'&&a[i]<='9')&&point)//处理小数部分数字字符
|
|
|
{
|
|
|
s+=(a[i]-'0')*t;
|
|
|
t*=0.1;
|
|
|
}
|
|
|
else if(a[i]=='.'&&point==0)//处理第一次出现的小数点
|
|
|
point=1;
|
|
|
else//处理非法字符
|
|
|
{
|
|
|
*flag=0;//标记输入了无效字符
|
|
|
return 0;
|
|
|
}
|
|
|
i++;
|
|
|
}
|
|
|
return s*symbol;
|
|
|
}
|
|
|
long long input_integer(int *flag)
|
|
|
{
|
|
|
char a[N];
|
|
|
*flag=1;//先默认输入格式合格为1不合格为0
|
|
|
long long i=0,s=0,symbol=1;//symbol判定正负号
|
|
|
scanf("%s",a);
|
|
|
if((a[0]=='-'&&strlen(a)==1)||(a[0]=='0'&&strlen(a)>1))//防止输入前导零和'-'判定输入合格
|
|
|
{
|
|
|
*flag=0;
|
|
|
return 0;
|
|
|
}
|
|
|
else if(a[0]=='-')//检测并处理正负号
|
|
|
{
|
|
|
symbol=-1;
|
|
|
i=1;
|
|
|
}
|
|
|
while(a[i]!='\0')
|
|
|
{
|
|
|
if(a[i]>='0'&&a[i]<='9')//处理数字字符
|
|
|
s=s*10+(a[i]-'0');
|
|
|
else//处理非法字符
|
|
|
{
|
|
|
*flag=0;//标记输入了无效字符
|
|
|
return 0;
|
|
|
}
|
|
|
i++;
|
|
|
}
|
|
|
return s*symbol;
|
|
|
}
|
|
|
int main()
|
|
|
{
|
|
|
int temp,flag=1,i=1,t=1;
|
|
|
double a;
|
|
|
output_hand();
|
|
|
while(1)
|
|
|
{
|
|
|
temp=choose();
|
|
|
switch(temp)
|
|
|
{
|
|
|
case 0://0表示结束程序
|
|
|
return 0;
|
|
|
case 1:
|
|
|
add();
|
|
|
break;
|
|
|
case 2:
|
|
|
sub();
|
|
|
break;
|
|
|
case 3:
|
|
|
mul();
|
|
|
break;
|
|
|
case 4:
|
|
|
div();
|
|
|
break;
|
|
|
case 5:
|
|
|
remainde();
|
|
|
break;
|
|
|
case 6:
|
|
|
factorial();
|
|
|
break;
|
|
|
case 7:
|
|
|
prime();
|
|
|
break;
|
|
|
case 8:
|
|
|
volume();
|
|
|
break;
|
|
|
case 9:
|
|
|
fibonacci();
|
|
|
break;
|
|
|
case 10:
|
|
|
power();
|
|
|
break;
|
|
|
case 11:
|
|
|
maxdiv();
|
|
|
break;
|
|
|
case 12:
|
|
|
minmul();
|
|
|
break;
|
|
|
case 13:
|
|
|
Swap();
|
|
|
break;
|
|
|
case 14:
|
|
|
Sort();
|
|
|
break;
|
|
|
default:
|
|
|
printf("输入有误\n");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|