}
(3)任意输入一个浮点数,小数点后最多有两位,作为一笔金额,显示为中文金额格式,银行里经常要用这种格式。
例如,输入1234.56,输出“壹仟贰佰叁拾肆元伍角陆分”为零,7为柒,8为捌,9为玖,。
010为拾,还有万、亿。
注意,2004应输出“贰仟零肆元整”,而不是“贰仟零佰零拾肆元整”。
尝试你能准确处理的最大金额是多少。
//最大范围整数部分10位//移位运算
//最大范围整数部分10位
#include
voidmain()
{
floatvalue;
cout<<"请输入最大位为十亿,小数为两位的浮点数:
";
cin>>value;
intmInteger;//整数金额
floatmDecimal;//小数金额
mInteger=(int)value;
mDecimal=value-mInteger;
//计算金额的最高位数
intn=mInteger;
intlength=0;
while(n)
{
n=n/10;
length++;
}
//处理整数部分
intm=1;
inti;
for(i=1;im*=10;
//整数部分显示
intx;
n=(int)value;
intlevel;
intcount;
for(i=length,level=(i-1)/4,count=0;i>0;i--)
{
x=n/m;//该位上的数值;
n=n%m;
m/=10;
if(level==(i-1)/4)
{
if(x==0)
count++;
else
{
if(count>0)
{
cout<<"零";
count=0;
}
}
}
else
{
level=(i-1)/4;
count=0;
if(x==0)count++;
}
switch(x)
{
case1:
cout<<"壹";
break;
case2:
cout<<"贰";
break;
case3:
cout<<"叁";
break;
case4:
cout<<"肆";
break;
case5:
cout<<"伍";
break;
case6:
cout<<"陆";
break;
case7:
cout<<"柒";
break;
case8:
cout<<"捌";
break;
case9:
cout<<"玖";
break;
case0:
break;
}
//显示该位的值
if(x!
=0)
{
switch(i%4)
{
case0:
cout<<"仟";
break;
case3:
cout<<"佰";
break;
case2:
cout<<"拾";
break;
default:
break;
}
}
if((i-1)%4==0)//亿,万位
{
switch((i-1)/4)
{
case2:
cout<<"亿";
break;
case1:
if(count==4)
break;
cout<<"万";
break;
case0:
cout<<"元";
break;
default:
break;
}
}
}
//小数部分,由于存储精度问题,存在误差
floattmp=mDecimal;
inttmp2;
if(mDecimal==0.0)
{
cout<<"整"<return;
}
for(i=0;i<2;i++)
{
tmp=tmp*10;
tmp2=(int)tmp;
tmp=tmp-(float)tmp2;
switch(tmp2)
{
case1:
cout<<"壹";
break;
case2:
cout<<"贰";
break;
case3:
cout<<"叁";
break;
case4:
cout<<"肆";
break;
case5:
cout<<"伍";
break;
case6:
cout<<"陆";
break;
case7:
cout<<"柒";
break;
case8:
cout<<"捌";
break;
case9:
cout<<"玖";
break;
case0:
if(i==0)
cout<<"零";
else
{
tmp2=1;
cout<<"壹";//弥补精度问题造成的误差
}
break;
}
if(i==0&&tmp2!
=0)
cout<<"角";
if(i==1&&tmp2!
=0)
cout<<"分"<}
cout<}
(4)输入若干个字符,统计输入的数字字符的个数。
#include
voidmain()
{
intcount=0;
charch;
do{
ch=cin.get();
if(ch>='0'&&ch<='9')
count++;
}while(ch!
='\n');
cout<<"该字符串中数字字符的个数count="<}
(5)从键盘上输入一个正整数n,按下式求出y的值:
y=1!
+2!
+3!
+…+n!
再编程分析,结果y应该是一个正整数,在整型范围之内,可正确计算的最大的n和y分别是多少。
#include
usingnamespacestd;
voidmain(void)
{
intn,y=0;
cout<<"请输入一个正整数n"<cin>>n;
for(inti=1;i<=n;i++)
{
inttmp=1;
for(intj=1;j<=i;j++)
{
tmp=tmp*j;
}
cout<<"i="<
y=y+tmp;
}
cout<<"y=1!
+2!
+3!
+…+n!
="<intmaxn=(1<<31)-1;
intcurrent_y=0,greatest_y=0,greatest_n=1;
intatmp=1,tmp=0;
while(atmp>=0)
{
atmp=1;
for(ints=1;s<=greatest_n;s++)
atmp=atmp*s;
tmp=current_y+atmp;
greatest_n++;
if(tmp>0)current_y=tmp;elsebreak;
if(maxn/atmp<=greatest_n)break;
}
cout<<"可正确计算的最大的n和y分别为:
"<}
(6)求一元二次方程ax2+bx+c的根。
任意输入系数a、b、c的值,显示方程的根。
注意什么条件下无根,什么条件下有一个根、两个根。
#include
#include
voidmain(void)
{
floata,b,c;//系数
doublex1,x2;//答案
floaty;//△
cout<<"请输入系数a:
";
cin>>a;
cout<<"请输入系数b:
";
cin>>b;
cout<<"请输入系数c:
";
cin>>c;
y=b*b-4*a*c;
if(a!
=0)
{
if(y>0)
{
x1=(-b+sqrt(y))/(2*a);
x2=(-b-sqrt(y))/(2*a);
cout<<"此方程有两个根:
"<}
else
{
if(y==0)
{
x1=-b/(2*a);
cout<<"此方程有两个同根:
"<}
else
{
cout<<"此方程无解"<}
}
}
else
{
if(b==0)
{
cout<<"此方程无效(a,b都等于零)!
"<}
else
{
x1=-c/b;
cout<<"此方程只有一个根:
"<}
}
}
(7)某个数列的前5项为:
,按此规律求出该数列的前20项,显示每一项的分子和分母。
#include
#include
voidmain()
{
intup1=2,up2=3;
intdown1=1,down2=2;
cout<cout<cout<for(inti=3;i<=20;i++)
{
intup=up1+up2;
intdown=down1+down2;
cout<up1=up2;up2=up;
down1=down2;down2=down;
}
}
(8)输入一个正整数x,显示其所有的因子。
在此基础上,求出1~100之间的完全数。
所谓完全数是指该数刚好等于它的因子之和(自己本身除外)。
例如,6的因子为1,2,3,且6=1+2+3,因此6是一个完全数。
#include
voidmain()
{
cout<<"inputainteger:
";
intnum,sum;
intfactor,j;
cin>>num;
cout<<"thenum"<";
for(factor=1;factor<=num;factor++)
{
if((num%factor)==0)
cout<}
cout<cout<<"-----------------------------------------"<cout<<"doyouwanttofindtheperfectnumbersbetwenn1and100:
(yorn)";
charflag;
cin>>flag;
if((flag=='y')||(flag=='Y'))
{
cout<<"theperfectnumbersbetween1and100are:
"<for(j=1;j<=100;j++)
{
sum=0;
for(factor=1;factor<=j;factor++)
{
if((j%factor)==0)
sum+=factor;
}
sum-=j;
if(sum==j)
cout<}
cout<}
}
(9)编程验证一个数学定理,任意一个正偶数都能分解为两个素数之和,例如,6=3+3、8=3+5。
#include
#include
voidmain()
{
intn;
inti,j;
boolflag;
cout<<"请输入任意整数(大于或等于6):
";
cin>>n;
while(n%2!
=0||n<6)
{
cout<<"请输入任意整数(大于或等于6):
";
cin>>n;
}
for(i=3;i<=n/2;i+=2)
{
flag=false;
for(j=3;j*j<=i;j+=2)//内层循环
if(i%j==0)//如果被整除,i不是素数
break;//停止内层循环
if(j*j>i){//如果循环到头了,i就是素数
flag=true;
}
if(!
flag)//判断当前的i不是素数则执行下一次循环
continue;
flag=false;
for(j=3;j*j<=(n-i);j+=2)//证明后一部分是素数
if((n-i)%j==0)//如果被整除,i不是素数
break;//停止内层循环
if(j*j>(n-i)){//如果循环到头了,i就是素数
flag=true;
}
if(flag)
{
cout<}
}
}
第五单元函数和编译预处理
根据题目要求,编写完整的程序,可所用已有函数,也可自行添加函数
(1)编写一个函数intdigitSum(intx),返回形参x的十进制数的各位数之和,例如123的各位数为1+2+3=6。
#include
intdigitSum(intx){
intsum=0;
while(x){
sum+=x%10;
x/=10;
}
returnsum;
}
voidmain(){
inta;
cin>>a;
cout<}
(2)编写一个函数,返回三个整数中的最大数并输出。
要求先编写函数实现两个数中求最大数。
#include
intmax_in_two(inta,intb){
if(a>b)
returna;
elsereturnb;
}
intmax_in_three(inta,intb,intc){
return(max_in_two(max_in_two(a,b),c));
}
voidmain(){
cout<<"inputthreeinteger:
";
inta,b,c;cin>>a>>b>>c;
cout<<"themaxnumberis:
"<}
(3)编写一个函数,计算组合数:
C(m,r)=m!
/(r!
×(m-r)!
),其中m,r为正整数,且m>r。
分别求出C(4,2),C(6,4),C(8,7)的组合数。
求阶乘和组合数分别用函数来实现。
#include//求阶乘函数
unsignedfactorial(unsignedn){
if(n==1)
return1;
elsereturnn*factorial(n-1);
}//求组合数函数
unsignedfc(unsignedm,unsignedr){
returnfactorial(m)/(factorial(r)*factorial(m-r));
}
voidmain()//递归调用
{cout<<"C(4,2)="<cout<<"C(6,4)="<cout<<"C(8,7)="<