算法竞赛入门经典(第2版本)第2章循环结构程序设计习题代码。ACM/蓝桥杯训练习题

1.水仙花数
#include<stdio.h>
int main()
{
int counter=0;
int h,p;
for(int i=1;i<=9;i++)
{

for(int j=0;j<=9;j++)
{

for(int f=0;f<=9;f++)

{
//printf("2\n");
h=i*100+j*10+f;
p=i*i*i+j*j*j+f*f*f;
//printf("%d %d\n",h,p);
if(h==p)
{
if(counter)printf("\n");
printf("CASE%d:%d\n",++counter,i*100+j*10+f);
}//enf of if
}//end of 3


}//end of 2

}//enf of 1



return 1;
}//end of main
2.韩信点兵
#include<stdio.h>
int main()
{
int three,five,seven;
int counter=0; //这是计数器,所以放在循环以外。
while(scanf("%d",&three)==1)  //输入变量数不确定则用while(scanf()==1)的形式。按enter+ctrl+Z+enter结束输入。
{
int mark=0; //此变量每次循环都应该重置。所以放在循环内。
scanf("%d",&five);
scanf("%d",&seven);
printf("%d  %d  %d",three,five,seven);
for(int i=3;i<=33;i++)
{	
	for(int j=2;j<=35;j++)
	{
	for(int k=1;k<=14;k++)
		{
		if(3*i+three==5*j+five&&3*i+three==7*k+seven&&3*i+three<=100)
			{
			 printf("case%d:%d",++counter,3*i+three);
		     mark=1;
             break;
			}
		}
	}
}
if(mark==0)
printf("No answer\n");

}//while
return 1;
}//end of main
3.倒三角形
#include<stdio.h>
int main()
{
int n;
int counter=0;
scanf("%d",&n);
for(;n>=1;n--)
{
for(int j=0;j<counter;j++)
printf(" ");
counter++;
for(int i=1;i<=2*n-1;i++)
printf("#");
printf("\n");
}
return 1;
}
4.子序列的和
#include<stdio.h>
int main()
{
int counter=0,a,b;
while(scanf("%d%d",&a,&b)==2&&(a!=0||b!=0))   
{
double sum=0.0;
for(;a<=b;a++)
{
//_int64 c; //VisualC++6.0 环境运行下,将long long int 用 _int64 进行替换。
sum=sum+1.0/a/a;  // 若直接1.0/(c*c)会溢出,除法溢出,double浮点数不能表达那么多的精度。
}
printf("Case%d:%.5lf",++counter,sum);  //lf打成f,错误
}
return 1;
}
/**
输入时float 用 %f, double 用 %lf, 这是约定(规定)。数据可以用定点格式,也可以 E 格式。zd
输出回float 用 %f, double 可以用 %lf, 也可以用 %f, 这将按默认 定点格式输出。没给 场宽和小数位数 时 按 默认位数输出。
若给了 场宽和小数位数 时 按 给定的 输出,若给的宽度不足时,按实际需要的场宽输出。float 有效数字为6-7位,double有效数字 14位。
%.16lf -- 输出 double,小数点下答 16位。
%20.10lf -- 输出 double,小数点下 10位, 场宽20位. 
***/
5.分数化小数
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c;
int zhengshu,yushu,last;
int hehe[30];
for(int p=0;p<30;p++)
{

hehe[p]=0;
}
while(scanf("%d%d%d",&a,&b,&c)==3&&a!=0&&b!=0&&c!=0)
{
zhengshu=a/b;
yushu=a%b;
for(int i=0;i<c;i++)
{
hehe[i+1]=(yushu*10)/b;
yushu=(yushu*10)%b;
}
last=(yushu*10)/b;
if(last>=5)
{
for(int j=c;j>=0;j--)
{
hehe[c]=(hehe[c]+1)%10;
if(hehe[c]==0)
continue;
else
break;
}
}//end of if  如果c+1位的小数大于5则进位。
hehe[0]=hehe[0]+zhengshu;
printf("%d.",hehe[0]);
for(int k=1;k<c+1;k++)
{
printf("%d",hehe[k]);
}
}
return 1;
}
6.排列
#include<stdio.h>
#include<math.h>
	void chushi(int a[],int n)
	{for(int i=0;i<n;i++)
	{
	a[i]=0;
	}
	}
	void push(int a[],int b)
	{
	a[b%10]++;  //若B是三位数,则B/10=前两位。B%10=最后一位。B/100等于第一位。B%100最后两位。(B/10)%10等于中间一位。(B/10)/10等于第一位。(B%100)%10等于最后一位。(B%100)/10等于中间一位。
	a[b/100]++;//总结%往后,/往前。且某位数A/10的位数加上A%10的位数总和等于A的位数。 10换成100、1000等也成立。
	a[(b/10)%10]++;
	}
void main()
{
  
	int visited[10]={0};
    int x,w,j;
	int k;
    for(int i=123;i<330;i++)
	{
    chushi(visited,10);
	x=i;
    w=2*i;
	j=3*i;
	push(visited,x);
	push(visited,w);
	push(visited,j);
	for( k=1;k<10;k++)  //k=0错误,K应该从1开始。
	{
	if(visited[k]!=1)
		break;
	}
	//printf("%d",k);
	if(k==10)
		printf("%d  %d %d\n",x,w,j);
	
	}

}
思考题:
1.#include<stdio.h>
#include<math.h>
int main()
{
int a;
scanf("%d",&a);
for(int i=1;i<=a;i++)//for(int i=2;i<=2*a;i=i+2)
printf("%d\n",i); //printf("%d\n",2*i); 切勿把2i写成2*i;
return 0;

}
2. 程序会一直运行不停止。原因为double数据在进行+0.1的时候由于计算机无法准确存储0.1导致误差。所以循环停止的判断条件
永远无法成立,程序会一直运行。(尤其判断的逻辑符号为!=、==时)。测试发现若把0.1改成0.5则程序可以正常停止。
若把运行的次数改小也可正常运行。
此问题的解决办法为:循环的停止判断条件(运行的次数。。)不用float.double类型的数据,用整型。因为很可能不能正常停止。

 

代码为本人手打原创与官网和其他博主有差异,但每道题的代码都符合题目的要求。欢迎大家指出错误和不足!

蟹蟹~

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值