算竞入门经典 第2章循环 习题

2-1水仙花

#include <iostream>
using namespace std;
int main(){
	for(int i = 100;i<=999;i++){
		int a = i/100;
		int b = i%100/10;
		int c = i%10;
		if(i == a*a*a+b*b*b+c*c*c) printf("%d\n",i);	
	} 
}

2-2 韩信点兵

#include <iostream>
using namespace std;
int main(){
	int a,b,c;
	while(scanf("%d %d %d",&a,&b,&c)==3){

	for(int i = 10;i<=100;i++){
		if(a==i%3&&b==i%5&&c==i%7)    //这里若变成i%3==a便出错,为什么?
			printf("%d\n",i);
	}
}
	return 0;
}

2-3 倒三角

#include <iostream>
using namespace std;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		//数量
		int l = n-i;
		int t = 1;
		while(l--) t+=2;
		//位置	
		int j = i; 
		while(--j) cout<<' ';//while(--i) cout<<' '; 这里我把i改变了,导致循环变量发生变化,死循环 
		while(t--) cout<<'*';
		cout<<endl;
	}
	return 0;
}

2-4 子序列的和 不知道坑在哪里

#include <iostream>
using namespace std;
int main(){
	int a,b;
	
	while(scanf("%d %d",&a,&b)==2&&(a||b)){
		double n = a,m = b;
		double sum = 0;
		
		for(double i = n;i<=m;i+=1){
			sum += 1/i/i;
		} 
		printf("%.5lf",sum);
	}
	
	return 0;
}

2-5分数化小数

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int a,b,c;
	while(scanf("%d %d %d",&a,&b,&c)==3&&(a||b||c)){
		float d = float(a)/b;	//0.166667
		int m = d*pow(10,c)+0.5;//1666->1667(四舍五入) 
		d = m/pow(10,c);
		cout<<d;		
	}
	return 0;
}

2-6 排列(待升级)(正确未知)

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	for(int q1=1;q1<=9;q1++)
		for(int q2=1;q2<=9;q2++)
			for(int q3=1;q3<=9;q3++)
				for(int q4=1;q4<=9;q4++)
					for(int q5=1;q5<=9;q5++)
						for(int q6=1;q6<=9;q6++)
							for(int q7=1;q7<=9;q7++)
								for(int q8=1;q8<=9;q8++)
									for(int q9=1;q9<=9;q9++)
										if(q1*100+q2*10+q3 == 2*(q4*100+q5*10+q6)&&q1*100+q2*10+q3==3*(q7*100+q8*10+q9)) cout<<q1*100+q2*10+q3<<endl;
		
	return 0;
}

题目2:

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	double i;
	for(i = 0;i!=10;i+=0.1) printf("%.1f\n",i);
	return 0;
}

我的主观感觉是0.1~10。显然结果并不是。

循环条件是i<=10时是0.1~10,条件是i!=10时,表现为起始数值不定,进入死循环一样的状态。

taesimple博客知道----浮点数陷阱:

1.c语言中double类型数据计算是有误差的,也就是说你每次加0.1,可能永远得不到整10,有可能是0.900001

eg:

if(0.1+0.1+0.1 == 0.3)
    printf("equal\n");
else
    printf("not equal\n");

不会输出"equal"。实际浮点数运算时,0.1+0.1+0.1 != 0.3

原因:

        计算机中所有的数都是由二进制表示的,一定有些数二进制是无法表示的,例如0.1,就像十进制无法精确表示10/3一样。

        再者,浮点数是采用分数+指数来表示的

        0.5 = 1/2;

        0.75 = 1/2+1/(2^2);

        0.1 = 1/2+1/(2^2)+...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值