4.3 循环结构程序设计案例(2)

例 4-11

续上篇

数列求和(洛谷P5722)

解法二:

#include<iostream>
using namespace std;

int main()
{
	int s=0,i=0,n;
	cin>>n; 
	while(n--)
	{
		s += ++i;
	}
	cout<<s;
	return 0;
 } 

理解++ii++的区别,一个i自身先加赋值给自己后参加运算,一个i先参加运算后自己再相加赋值给自己

例 4-12

数列求和(和)。计算 0.1+0.2+0.3+...+(n-0.2)+(n-0.1)的值,其中 n 为不大于 100 的整数。

解答

#include<iostream>
using namespace std;
int main()
{
   int n;
   double s=0;
   cin>>n;
   for(double i=0;i!=n;i+=0.1)
   {
       s+=i;
   }
   cout<<s;
   return 0;
}

上述代码会造成死循环,是因为 double 类型浮点数精度问题,会造成微小误差,所以 i != n 永远成立。

改正如下:

#include<iostream>
using namespace std;
int main()
{
   int n;
   double s=0;
   cin>>n;
   for(double i=0;i<(n-0.01);i+=0.1)
   {
       s+=i;
   }
   cout<<s;
   return 0;
}

0.01间的误差是可以接受的。

例 4-13

质数口袋(洛谷P5722)

小 A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口袋的负载量就是口袋里的所有数字之和。但是口袋的承重量有限,不能装得下总和超过 L (1≤L≤105)
)的质数。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。

输入格式

一行一个正整数 L。

输出格式

将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。

输入输出样例

输入 输出
100 2
3
5
7
11
13
17
19
23
9

解答

#include<iostream>
using namespace std;

int L,s=0,num=1,isZ=1,c=0;
int main()
{
    cin>>L;
    while(s<L)
    {
        num++;
        isZ=1;
        for(int i=0;i<num;i++)
        {
            if(i > 1 && i != num && num%i==0)
            {
            	isZ=0;
            	break;
			}
        }
        if(isZ==1)
        {
        	s+=num;
        	if(s<=L)
        	{
        		cout<<num<<endl;
	        	c++;
			}
			else
				break;
		}
    }
    cout<<c<<endl;
    return 0;
}

未完待续。。。

posted @ 2021-04-25 21:33  CodeSpark  阅读(261)  评论(0)    收藏  举报